<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Just Developer Blog, заметки с тегом: using Fragment without UI</title>
<link>http://bibobo.ru/tags/using-fragment-without-ui/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Использование Fragment без UI для хранения данных</title>
<guid isPermaLink="true">http://bibobo.ru/all/ispolzovanie-fragment-bez-ui-dlya-hraneniya-dannyh/</guid>
<link>http://bibobo.ru/all/ispolzovanie-fragment-bez-ui-dlya-hraneniya-dannyh/</link>
<comments>http://bibobo.ru/all/ispolzovanie-fragment-bez-ui-dlya-hraneniya-dannyh/</comments>
<description>&lt;p&gt;Fragment — это сущность, позволяющая инкапсулировать часть интерфейса и его логику для переиспользования. Фрагменты были представлены в Android 3.0 и позволили существенно упростить работу по проектированию интерфейса для устройств с различными размерами экранов (так называемая парадигма Responsive Design, когда одно и то же приложение выглядит по разному на устройствах с различной диагональю экрана).&lt;/p&gt;
&lt;p&gt;&lt;input id="button_using_fragment_without_ui" type="button" onclick="toggle(cut_using_fragment_without_ui, button_using_fragment_without_ui)" value="Читать дальше" hiddenText="Свернуть" visibleText="Читать дальше"&gt;&lt;/p&gt;
&lt;div id="cut_using_fragment_without_ui" style="display: none;" displayOld=""&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Фрагменты очень удобны и обладают следующими основными свойствами:&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Очень похожи на Activity и имеют схожий цикл жизни, при этом дополненный несколькими событиями;&lt;/li&gt;
&lt;li&gt;Как и Activity инкапсулируют логику работы с интерфейсом;&lt;/li&gt;
&lt;li&gt;Могут жить только внутри Activity, при этом один и тот же фрагмент может быть использован в различных Activity, что существенно упрощает задачу при проектировании интерфейса для различных устройств.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Фрагменты обладают ещё одним свойством, которое может быть весьма полезно при разработке приложений — фрагмент можно создать вовсе без пользовательского интерфейса и заставить его не умирать при пересоздании родительской Activity. Это свойство может быть очень к месту для хранения источника данных (модели) в таком фрагменте.&lt;/p&gt;
&lt;p&gt;Для многих начинающих разработчиков, пришедших с десктопных платформ, может стать настоящим откровением поведение Android например при изменении ориентации устройства — в таком случае Activity будет уничтожена и создана вновь с лэндскейпным лэйаутом. Соответственно если к Activity привязан какой-либо источник данных — он будет так же пересоздан (или перезагружен, в случае ContentProvider).&lt;/p&gt;
&lt;p&gt;Чтобы этого не произошло можно создать специальный фрагмент без UI и передать в его конструкторе значение true в сеттер setRetainInstance (Java), либо установить значение true свойству RetainInstance (C#). Далее инициализировать и сохранить в нём нашу модель.&lt;/p&gt;
&lt;p&gt;Все, после подобных манипуляций получим постоянный доступ к модели с сохранением её состояния даже при пересоздании родительской Activity.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Ниже небольшой пример кода на C# и Xamarin:&lt;/p&gt;
&lt;pre&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// Фрагмент без интерфейса, будет хранить нашу модель
/// (данный фрагмент будет ретейниться после уничтожения основной вьюхи и наши данные не будут перегенериваться при пересоздании Activity)
/// &amp;lt;/summary&amp;gt;
public class ModelHolderFragment : Android.App.Fragment{
	public static string SearchTag = &amp;quot;MODEL_HOLDER_FRAGMENT&amp;quot;;

	public ViewPagerItem[] DataSourceItems { get; private set;}

	public override void OnCreate (Bundle savedInstanceState)
	{
		base.OnCreate (savedInstanceState);

		DataSourceItems = GenViewPagerItems ();

		//установим флаг, который запретит фрагменту умирать при уничтожении основной вьюхи
		RetainInstance = true;
	}

	/// &amp;lt;summary&amp;gt;
	/// Генерация фейковых данных
	/// &amp;lt;/summary&amp;gt;
	/// &amp;lt;returns&amp;gt;The view pager items.&amp;lt;/returns&amp;gt;
	private ViewPagerItem[] GenViewPagerItems(){
		...
		return items;
	}
}

///Хэндлер события OnCreate родительской Activity - тут создадим экземпляр нашего фрагмента
protected override void OnCreate(Bundle savedInstanceState) {
	base.OnCreate(savedInstanceState);
	SetContentView (Resource.Layout.activity_main);

	//инициализируем фрагмент без интерфейса для хранения модели только при первом создании вьюхи
	if (savedInstanceState == null) {
		FragmentManager.BeginTransaction ().Add ((Android.App.Fragment)new ModelHolderFragment (), ModelHolderFragment.SearchTag).Commit();
		FragmentManager.ExecutePendingTransactions ();
	}
	_model = (ModelHolderFragment)FragmentManager.FindFragmentByTag (ModelHolderFragment.SearchTag);
}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
<pubDate>Fri, 19 Jun 2015 21:01:03 +0300</pubDate>
</item>


</channel>
</rss>