Android 在碎片上有奇怪行为的后退按钮
以下是我的导航:Android 在碎片上有奇怪行为的后退按钮,android,android-fragments,Android,Android Fragments,以下是我的导航: HomeFragment->LoginFragment->CreateEventFragment MyHomeFragment是我的MainActivity中的第一个片段 在我的代码中,我使用相同的视图id(在我的MainActivity的布局中的FrameLayout:R.id.container) 因此,每个replace()都被这样调用: FragmentManager fragmentManager = mContext.getSupportFragmentManage
HomeFragment->LoginFragment->CreateEventFragment
MyHomeFragment
是我的MainActivity
中的第一个片段
在我的代码中,我使用相同的视图id
(在我的MainActivity
的布局中的FrameLayout
:R.id.container
)
因此,每个replace()
都被这样调用:
FragmentManager fragmentManager = mContext.getSupportFragmentManager();
fragmentManager.beginTransaction()
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.replace(containerId, nextFragment).addToBackStack(null).commit();
除了LoginFragment
到CreateEventFragment
,因为用户登录后不必返回LoginFragment
,所以我不调用addToBackStack()
但奇怪的事情正在发生:
当我在CreateEventFragment
上时,在成功登录并按下后退按钮后,我的CreateEventFragment
onDestroy()
不会被调用
调试它我注意到它没有从backbackback
中删除,我做错了什么
编辑
一些代码:
公共替换片段方法,在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);
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);
}
在登录片段上:
BaseFragment nextFragment =
(PreferencesHandler.isLogged()) ?
CreateEventFragment.newInstance() :
LoginFragment.newInstance("create_event") ;
replaceFragment(R.id.main_fragment_container, nextFragment, true);
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);
}
我的main活动的布局:
<?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
注意到按back按钮调用的是LoginFragment
onDestroy
,而不是CreateFragment
。还注意到backStack有LoginFragment
,我猜不应该,对吗?您是否覆盖了onBack来执行backStack。pop?不,甚至在我的活动中没有onBackPressed()
,但是我应该覆盖它吗?如果您不想在后堆栈中使用它,那么就不要使用。addToBackStack(null)
当您进行替换时。这就是我对我的问题所说的。问题是,在按下CreateEventFragment
后,它没有被销毁。您是否覆盖了onBack以执行backbackback.pop?不,甚至不是我的活动中的onBackPressed()
,但我应该覆盖它吗?如果您不希望它在后堆栈中,请不要使用.addToBackStack(null)
当您进行替换时。这就是我对我的问题所说的。问题是,在按下CreateEventFragment
后,它没有被销毁。您是否覆盖了onBack以执行backbackback.pop?不,甚至不是我的活动中的onBackPressed()
,但我应该覆盖它吗?如果您不希望它在后堆栈中,请不要使用.addToBackStack(null)
当您进行替换时。这就是我对我的问题所说的。问题是,在按下CreateEventFragment
后,它没有被销毁