2013-11-16 3 views
0

Во-первых, некоторая справочная информация. У меня есть Activity, на котором размещается несколько Fragment s; они скрыты и показаны таким образом, что одновременно отображается только один Fragment. В каждом Fragment есть несколько настраиваемых View s, которые я вызываю IncrementCounter. Эти представления отображают число и увеличивают это число на 1 при нажатии.Сохранение пользовательского вида внутри фрагмента

Каждый из Fragment s имеет setRetainInstance(true), когда он был создан в моем Activity. Когда создается Activity, я проверяю, существуют ли Fragment s; если они это сделают, я храню ссылку на них; если нет, то я создаю новый экземпляр, как это:

autonFragment = (AutonomousScoutingFragment) getFragmentManager() 
      .findFragmentByTag("auton"); 
teleopFragment = (TeleoperatedScoutingFragment) getFragmentManager() 
      .findFragmentByTag("teleop"); 
postMatchFragment = (PostMatchScoutingFragment) getFragmentManager() 
      .findFragmentByTag("post_match"); 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
if (autonFragment == null) { 
    Log.d("onCreate", "autonFragment is null!"); 
    autonFragment = new AutonomousScoutingFragment(); 
    autonFragment.setRetainInstance(true); 
    ft.add(R.id.scouting_fragment_container, autonFragment, "auton") 
     .hide(autonFragment); 
} 
if (teleopFragment == null) { 
    Log.d("onCreate", "teleopFragment is null!"); 
    teleopFragment = new TeleoperatedScoutingFragment(); 
    teleopFragment.setRetainInstance(true); 
    ft.add(R.id.scouting_fragment_container, teleopFragment, "teleop") 
     .hide(teleopFragment); 
} 
if (postMatchFragment == null) { 
    Log.d("onCreate", "postMatchFragment is null!"); 
    postMatchFragment = new PostMatchScoutingFragment(); 
    postMatchFragment.setRetainInstance(true); 
    ft.add(R.id.scouting_fragment_container, postMatchFragment, 
    "post_match").hide(postMatchFragment); 
} 
ft.commit(); 

Одна проблема, у меня есть то, что после каждого изменения ориентации, кажется, как будто Fragment s не фактически сохраняется, как всегда время я вижу отладки печатает, что все они равны нулю. Это может быть связано с моей большой проблемой; Я не уверен.

Я пытаюсь выяснить, как сохранить значение числа, хранящегося в каждом IncrementCounter, в результате изменения конфигурации, в частности, вращения. Я переопределил onSaveInstanceState() и onRestoreInstanceState() в IncrementCounter. Когда я поворачиваю свое устройство, я вижу, что onSaveInstanceState() вызывается на всех IncrementCounter s у меня есть в моих Fragment s. Однако соответствующий onRestoreInstanceState() никогда не вызывается, а мои IncrementCounter s не восстанавливают свои состояния. Каков правильный способ справиться с чем-то подобным? Я несколько часов стучал головой о стол, чтобы справиться с этой проблемой.

ответ

0

Поскольку Фрагменты имеют значение setRetainInstance (true), они не будут уничтожены при вращении. Активность будет уничтожена, а фрагменты будут отделяться до создания нового действия. Тем не менее, фрагменты снова пройдут метод onCreateView(), поэтому вам нужно будет восстановить их IncrementCounters.

Кроме того, вы можете сохранить состояние в onSaveInstanceState(), а затем восстановить его в onCreate(), onCreateView() и нескольких других методах, которые все переданы в том же пакете, что и параметр.

+0

Спасибо, но одна из моих проблем заключается в том, что фрагменты, по-видимому, не выживают при изменении конфигурации. Правильно ли я делаю это для восстановления своей деятельности? –

Смежные вопросы