后退按钮在片段上有奇怪的行为

时间:2015-06-10 22:37:46

标签: android android-fragments

这是我的导航:

HomeFragment -> LoginFragment -> CreateEventFragment

我的HomeFragment是我MainActivity内的第一个片段。

在我的代码中,我使用相同的视图idFrameLayout的{​​{1}}布局中的MainActivity替换每一个:R.id.container。< / p>

所以每个replace()都被这样调用:

FragmentManager fragmentManager = mContext.getSupportFragmentManager();
fragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .replace(containerId, nextFragment).addToBackStack(null).commit();

LoginFragmentCreateEventFragment除外,因为在用户登录后,他不必返回LoginFragment,因此我不会致电addToBackStack()

但是发生了一些奇怪的事情: 当我在CreateEventFragment时,登录成功后,按后退按钮,我的CreateEventFragment onDestroy()未被调用。

调试它我注意到它没有从backStack删除,我做错了什么?

修改

一些代码:

常见替换片段方法,在BaseFragment内,所有三个Fragment的父类

public void replaceFragment(int containerId, Fragment nextFragment, boolean addToBackStack){
    FragmentManager fragmentManager = mContext.getSupportFragmentManager();
    if (addToBackStack)
        fragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .replace(containerId, nextFragment).addToBackStack(null).commit();
    else
        fragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .replace(containerId, nextFragment).commit();
}

HomeFragment

BaseFragment nextFragment =
            (PreferencesHandler.isLogged()) ?
                CreateEventFragment.newInstance() :
                LoginFragment.newInstance("create_event") ;
replaceFragment(R.id.main_fragment_container, nextFragment, true);

LoginFragment

public void goToNextFragment(){
    Fragment nextFragment;
    switch (mIntent){
        case "create_event":
            nextFragment = new CreateEventFragment();
            break;
        case "participate":
            nextFragment = new ListsFragment();
            break;
        default:
            nextFragment = new HomeFragment();
            break;
    }
    replaceFragment(R.id.main_fragment_container, nextFragment, false);
}

我的MainActivity布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolbar_actionbar"
        layout="@layout/toolbar_actionbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:layout_below="@+id/toolbar_actionbar"
        tools:context=".MainActivity">

        <FrameLayout
            android:id="@+id/main_fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/toolbar_actionbar"
            />

        <fragment android:id="@+id/navigation_drawer"
            android:layout_width="@dimen/navigation_drawer_width"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:name="Fragments.`NavigationDrawerFragment`"
            tools:layout="@layout/fragment_navigation_drawer" />

    </android.support.v4.widget.DrawerLayout>
</RelativeLayout>

编辑2

注意按下后退按钮会调用LoginFragment onDestroy,而不是CreateFragment。还注意到backStack有LoginFragment,猜不应该,对吧?

0 个答案:

没有答案