我有这样的应用
一项活动及其内部>
在片段c内也有4个子片段
在主要活动中(使用导航抽屉作为源)我在这样的oncreate中调用片段a
FragmentManager fragmentManager=getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_place,new First_Fragment()).addToBackStack("First").commit();
我的问题是如何控制后退按钮以始终返回片段a并且当片段a打开关闭app时 我正在使用addToBackStack(null)但不是我想要的,因为它将显示我打开的片段的所有历史记录
答案 0 :(得分:1)
将片段a添加到后台堆栈时,“addToBackStack(String name)”会传入一个名称。
然后听取片段中的背压
FragmentManager fm = getFragmentManager();
fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
}
});
确保在每个片段未显示时停止侦听。
然后你可以弹回添加到后栈的命名片段
FragmentManager fm = getActivity()
.getSupportFragmentManager();
fm.popBackStack ("name", FragmentManager.POP_BACK_STACK_INCLUSIVE);
确保未将其余的片段事务添加到后台堆栈。这应该会给你你想要的行为。
答案 1 :(得分:1)
addToBackStack(String tag)
用于将片段添加到backstack,它包含字符串作为参数。此参数可以为null或具有某个值。
如果您传递null,它会将您的片段添加到带有 null 标记的Backstack中。 addToBackStack(null)并不意味着您的片段未添加到backstack。
如果您希望您的片段不会被添加到backstack,那么只需删除此行。
如果要将片段添加到backstack并希望它可见onBackPressed
,那么您可以使用
getSupportFragmentManager().popBackStackImmediate(/* Fragment TAG */,0);
代码: - 请尝试以下代码并告知我们。
复制主活动中的以下功能。
/**
* function to show the fragment
*
* @param name fragment to be shown
* @param tag fragment tag
*/
public void showFragment(Fragment name, String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
// check if the fragment is in back stack
boolean fragmentPopped = fragmentManager.popBackStackImmediate(tag, 0);
if (fragmentPopped) {
// fragment is pop from backStack
} else {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, name, tag);
fragmentTransaction.addToBackStack(tag);
fragmentTransaction.commit();
}}
使用以下代码显示片段。
showFragment(yourFragment, yourFragmentTag);
在mainActivity onBackPressed。
@override
public void onBackPressed(){
FragmentTransaction fts = getSupportFragmentManager().beginTransaction();
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() >= 2) {
// always show your fragment a here
showFragment(new FragmentA(), FragmentA.class.getSimpleName());
} else {
// finish your activity
}
}