Восстановление состояния фрагмента после изменения конфигурации при изменении макета действия

Моя активность имеет макет с одной панелью в портретной ориентации и макет с двумя панелями в альбомной ориентации с использованием фрагментов. Я бы хотел, чтобы система восстановила все виды после изменения ориентации, но я не знаю, с чего начать.

Возможно ли это даже с учетом того, что расположение отличается (но схоже) в двух направлениях?

Если кто-то реализовал это (или хотя бы попробовал), поделитесь своим опытом.

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);
        }
}
Другие вопросы по тегам