我在SO上看过很多popbackstack问题,根据我的代码看起来我想要做的事情应该有用。
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弹出窗口,告诉我发生了什么,当按下后退按钮时,我得到一个带有“popstack”Toast消息的空白屏幕(告诉我“if”语句是正确的。)当我再次点击它时我得到“超级”(这也是我所期待的)。
我不明白为什么我的代码不会回到主片段?
答案 0 :(得分:1)
要记住的关键是后台堆栈包含交易而不是碎片。
由于您使用的是POP_BACK_STACK_INCLUSIVE
标记,因此当您点击后退按钮时,名称为"Attend"
的交易也会被弹出(即撤消)。因为此事务以编程方式添加了您的第一个片段,所以您将返回到Activity的初始状态(容器中没有ID为content_frame
的片段)。
适当的分辨率取决于您要实现的目标(可以添加多少碎片,您是否总是希望在返回时返回到第一个片段等)。您可能要考虑不添加初始事务到后面的堆栈。或者您可以添加它,但不使用包含标志,并且如果后栈条目计数是>则仅使用您的自定义onBackPressed逻辑。 1。