onBackPressed()popBackStack问题

时间:2014-12-27 19:05:34

标签: android android-fragments

我在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”语句是正确的。)当我再次点击它时我得到“超级”(这也是我所期待的)。

我不明白为什么我的代码不会回到主片段?

1 个答案:

答案 0 :(得分:1)

要记住的关键是后台堆栈包含交易而不是碎片。

由于您使用的是POP_BACK_STACK_INCLUSIVE标记,因此当您点击后退按钮时,名称为"Attend"的交易也会被弹出(即撤消)。因为此事务以编程方式添加了您的第一个片段,所以您将返回到Activity的初始状态(容器中没有ID为content_frame的片段)。

适当的分辨率取决于您要实现的目标(可以添加多少碎片,您是否总是希望在返回时返回到第一个片段等)。您可能要考虑不添加初始事务到后面的堆栈。或者您可以添加它,但不使用包含标志,并且如果后栈条目计数是>则仅使用您的自定义onBackPressed逻辑。 1。