Вращение Android: почему тег не восстанавливает фрагмент?

У меня есть активность под названием MainActivity с фрагментом внутри под названием HomeFragment. Я хочу восстановить фрагмент после поворота экрана, но чего-то не хватает. Я следил за процессом ниже:

  1. сохранить фрагмент, используя getSupportFragmentManager().putFragment(...) во время onSaveInstanceState
  2. попробуйте восстановить фрагмент с помощью fragmentManager.findFragmentByTag во время onCreate (после проверки, что пакет не равен нулю)

Однако findFragmentByTag возвращает null.

Вот фрагменты кода внутри MainActivity:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set up the action bar to show a dropdown list.
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        setupNavigationSpinner(actionBar);
        FragmentManager fragmentManager = getSupportFragmentManager();

        if (savedInstanceState != null) {

            if (fragmentManager.findFragmentByTag("frag") != null) { 
                //  findFragmentByTag always return null
                homeFragment = (HomeFragment) fragmentManager
                        .findFragmentByTag(HomeFragment.ARG_ITEM_ID);
                contentFragment = homeFragment;
            }else{
                homeFragment = new HomeFragment();
                switchContent(homeFragment, HomeFragment.ARG_ITEM_ID);
            }
        } else {
            homeFragment = new HomeFragment();
            switchContent(homeFragment, HomeFragment.ARG_ITEM_ID);
        }

}


@Override
public void onSaveInstanceState(Bundle outState) {
    getSupportFragmentManager().putFragment(outState, "frag",homeFragment );
}

public void switchContent(Fragment fragment, String tag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    while (fragmentManager.popBackStackImmediate())
        ;

    if (fragment != null) {
        FragmentTransaction transaction = fragmentManager
                .beginTransaction();
        transaction.replace(R.id.content_frame, fragment, tag);
        // Only ArticlDetailFragment is added to the back stack.
        if (!(fragment instanceof Fragment)) {
            transaction.addToBackStack(tag);
        }
        transaction.commit();
        contentFragment = fragment;
    }
}

person VSB    schedule 04.10.2014    source источник
comment
По какой-то причине у меня была такая же проблема.   -  person Alex K    schedule 04.10.2014
comment
Эээ ... вы можете показать нам, что происходит в switchContent.   -  person Paul Burke    schedule 04.10.2014
comment
HomeFragment.ARG_ITEM_ID равно "frag"? Почему вы проверяете "frag"? Как я вижу, вы заменяете свой фрагмент тегом HomeFragment.ARG_ITEM_ID.   -  person Egor Neliuba    schedule 04.10.2014


Ответы (1)


Нет причин звонить

getSupportFragmentManager().putFragment(outState, "frag",homeFragment );

Состояние Fragment будет автоматически восстановлено. Проблема в том, что вы не называете супер своего onSaveInstanceState. Это должно выглядеть так:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

Кроме того, вы устанавливаете тег как HomeFragment.ARG_ITEM_ID, а затем ищете "frag". Есть HomeFragment.ARG_ITEM_ID == "frag"?

person Paul Burke    schedule 04.10.2014
comment
Я просто изменил ключи на FRAG, чтобы проверить возможные ошибки, однако основная проблема, как вы заметили, заключалась в вызове `super.onSaveInstanceState (outState);` - person VSB; 04.10.2014
comment
@VSB Отлично. :-) Не забудьте принять этот ответ, если он решил вашу проблему. - person Paul Burke; 04.10.2014