Фрагмент onCreateView и onActivityCreated не вызывается при вращении

Я работаю с фрагментами и помещаю новые фрагменты в backstack, но когда я поворачиваю устройство дважды, фрагмент onCreateView, onActivityCreatedи т. д. в жизненном цикле фрагмента методы никогда не вызываются, оставляя пустой экран. Это происходит только тогда, когда фрагмент был добавлен в backstack или возвращается к первому фрагменту в backstack.

Вот методы обработки фрагментов моей деятельности:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Injection
    MormonChannel.injectActivity(this);

    setDrawerIndicatorEnabled(true);

    // Do not set currentNavigationItem here.
    NavigationItemSelectedEvent.NavigationItem navItem = null;
    Intent intent = getIntent();
    if (intent != null) {
        navItem = (NavigationItemSelectedEvent.NavigationItem)
        intent.getSerializableExtra(EXTRA_NAV_ITEM);
    }

    if (savedInstanceState == null) {
        FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction().replace(R.id.container, new FeatureListFragment()).commit();
        if (navItem != null) {
            onNavigationItemSelected(new NavigationItemSelectedEvent(navItem));
        } else {
            currentNavigationItem = NavigationItemSelectedEvent.NavigationItem.FEATURES;
        }
    }

}

@Subscribe
public void onNavigationItemSelected(NavigationItemSelectedEvent event) {

    if (currentNavigationItem == event.getNavigationItem()) {
        return;
    }
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.popBackStack();
    NavigationItemSelectedEvent.NavigationItem navigationItem = event.getNavigationItem();
    String name = navigationItem.getName();
    switch (navigationItem) {
        default:
        case FEATURES:
            // Nothing needs to be done it is already there.
            break;
        case AUDIO:
            fragmentManager.beginTransaction().replace(R.id.container,
                    CollectionListFragment.newInstance(prefs.getLanguageId(), prefs.getAudioCollectionId()))
                    .addToBackStack
                            (name).commit();
            break;
        case VIDEO:
            fragmentManager.beginTransaction().replace(R.id.container,
                    CollectionListFragment.newInstance(prefs.getLanguageId(), prefs.getVideoCollectionId()))
                    .addToBackStack(name).commit();
            break;
        case RADIO:
            fragmentManager.beginTransaction().replace(R.id.container,
                    CollectionListFragment.newInstance(prefs.getLanguageId(), prefs.getRadioCollectionId()))
                    .addToBackStack(name).commit();
            break;
        case HISTORY:
            fragmentManager.beginTransaction().replace(R.id.container, new HistoryFragment()).addToBackStack(name).commit();
            break;
        case DOWNLOADS:
            fragmentManager.beginTransaction().replace(R.id.container, new DownloadsFragment()).addToBackStack(name).commit();
            break;
        case PLAYLISTS:
            fragmentManager.beginTransaction().replace(R.id.container, new PlaylistFragment()).addToBackStack(name).commit();
            break;
    }
    currentNavigationItem = navigationItem;
}

Вот мой код CollectionListFragment:

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MormonChannel.injectFragment(this);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.collection_list_fragment, container, false);
    ButterKnife.inject(this, v);
    return v;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    listView.setDividerHeight(0);
    listView.setFastScrollEnabled(true);


    Bundle args = getArguments();
    if (args != null) {
        languageId = args.getLong(ARG_LANGUAGE_ID, -1L);
        collectionId = args.getLong(ARG_COLLECTION_ID, -1L);
        if (args.containsKey(ARG_SORT)) {
            sort = (Sort) args.getSerializable(ARG_SORT);
        }
    }

    if (collectionId == -1L || languageId == -1L) {
        // TODO Implement Empty Collection Text
    } else {
        collection = collectionManager.findByCollectionId(languageId, collectionId);
        getLoaderManager().initLoader(LOADER_ID, null, this);
    }

    titleEvent = new TitleChangeEvent(collection != null ? collection.getTitle() : getString(R.string.app_name));
    bus.post(titleEvent);
}

Манифест для деятельности:

<activity
    android:name=".activity.MainActivity"
    android:launchMode="singleTask">
    <meta-data
        android:name="android.app.default_searchable"
        android:value=".activity.SearchActivity"/>
</activity>

1 ответ

В своем коде CollectionListFragment добавьте вызов метода setRetainInstance() в методе onCreate() с аргументом true в качестве аргумента:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    MormonChannel.injectFragment(this);

}

Использование setRetainInstance(true) гарантирует, что при изменении конфигурации активность будет прервана, но android не уничтожит фрагмент, который он размещает.

Вместо этого Android сохранит состояние фрагмента и отсоединит его от действия. Также он не разрушит фрагмент и не создаст его позже при создании хостинга. Таким образом, фрагмент не будет получать вызовы своих методов onDestroy() и onCreate().

Другие вопросы по тегам