我在SO上看到了很多弹出堆栈的问题,基于我的代码,我想要做的事情应该会起作用。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content_frame, new MainFragment());
ft.addToBackStack("Attend"); //here is the add to backstack
ft.commit();
}这显示了我的主要片段在我的空白布局。
稍后,我有了一个onOptionsItemSelected,它启动了一个新的片段。
FragmentManager fm1 = getFragmentManager();
FragmentTransaction ft1 = fm1.beginTransaction();
ft1.replace(R.id.content_frame, new ServiceFragment());
ft1.addToBackStack("ServiceTimes");
ft1.commit();
return true;这个片段出现了。问题就从这里开始。我按后退按钮,希望返回到主片段。
@Override
public void onBackPressed() {
FragmentManager fm = getFragmentManager();
if(fm.getBackStackEntryCount() > 0) {
Toast.makeText(getApplicationContext(),"popstack",Toast.LENGTH_SHORT).show();
fm.popBackStackImmediate("Attend", fm.POP_BACK_STACK_INCLUSIVE);
} else {
Toast.makeText(getApplicationContext(),"Super",Toast.LENGTH_SHORT).show();
super.onBackPressed();
}
}我添加了一个Toast弹出来告诉我发生了什么,当按下后退按钮时,我得到了一个空白的白色屏幕,上面有“pop堆栈”Toast消息(告诉我"if“语句是正确的)。当我再次点击它时,我会得到”超级“(同样也是我所期望的)。
我不明白为什么我的代码不返回到主要片段?
发布于 2014-12-27 19:14:07
需要记住的是,back堆栈包含的是事务而不是片段。
因为您使用的是POP_BACK_STACK_INCLUSIVE标志,所以当您单击back按钮时,名称为"Attend"的事务也会弹出(即取消)。因为这个事务以编程方式添加了第一个片段,所以您将返回到活动的初始状态(在容器中没有id content_frame的片段)。
适当的解决方案取决于您正试图实现的目标(可以添加多少片段,是否总是希望返回到后面按下的第一个片段,等等)。您可能需要考虑不将初始事务添加到后台堆栈。或者您可以添加它,但不使用包含的标志,并且只有当后台堆栈条目计数> 1时才使用自定义onBackPressed逻辑。
https://stackoverflow.com/questions/27670571
复制相似问题