Восстановление состояния фрагмента после изменения конфигурации при изменении макета действия
Моя активность имеет макет с одной панелью в портретной ориентации и макет с двумя панелями в альбомной ориентации с использованием фрагментов. Я бы хотел, чтобы система восстановила все виды после изменения ориентации, но я не знаю, с чего начать.
Возможно ли это даже с учетом того, что расположение отличается (но схоже) в двух направлениях?
Если кто-то реализовал это (или хотя бы попробовал), поделитесь своим опытом.
3 ответа
Я призываю вас использовать фрагмент с setRetainInstance(true) в его методе onCreate. Это заставляет фрагмент сохранять свои переменные-члены при изменениях конфигурации Activity. Пожалуйста, прочтите этот пост в блоге, который объясняет необходимую информацию: http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
Может быть, я знаю, в чем проблема. Надеюсь, мой ответ поможет кому-то решить эту проблему. Если в вашей активности есть фрагмент, вы настраиваете эту активность в AndroidManifest.xml с помощью
android:configChanges="keyboardHidden|orientation|screenSize"
затем вы хотите изменить макет действия, когда onConfigurationChanged
срабатывает. Как только активность надувает новый макет или использует setContentView(R.layout.new_layout);
фрагмент исчезнет, однако этот фрагмент все еще работает и просто исчезнет из поля зрения.
Так что проблема в том, что фрагмент прикреплен к предыдущему макету, что вам нужно сделать:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
if (fm.findFragmentById(R.id.pane_list) == null) {
// instantiate fragment and add to view
mFragment = new ItemFragment();
transaction.add(R.id.pane_list, mFragment );
} else {
// fragment already exists, we re-attahced it
mFragment = fm.findFragmentById(R.id.pane_list);
transaction.detach(mFragment);
transaction.attach(mFragment);
}
transaction.commit();
После отсоединения от старого макета и прикрепления к новому макету проблема решена. Поправьте меня, если там что-то не так:)
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}
Который вы можете использовать позже, как это:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
// Restore last state for checked position.
mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
}
}