Fragment PopBackStack

时间:2014-09-19 11:21:23

标签: android android-fragments back-stack onbackpressed

我遇到了一个奇怪的问题,同时使用Fragments并弹出它们。

我有一个片段活动:

步骤1:我在起始命名片段A中的该活动的onCreate中附加了一个片段:

这是片段活动的onCreate

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
    }

步骤:2之后,我附上了以下代码替换了Fragment:

Fragment_More moreFragment = new Fragment_More();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();

第3步:在此之后我再次以相同的方式在Fragment_More上添加了一个片段:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();

这是我的碎片活动onBackPressedButton Lisetener:

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.frameContent);

 if(fm.getBackStackEntryCount() > 1){
         fm.popBackStack();
    } else{
        finish();
    }
}

以下是我遇到的问题:

当我从第3步按回来时,它按照onBackPressed的描述成功地给了我以前的片段,它会回弹并将我带到前面的片段。但是从Fragment_More开始,当我再次按下时,它会显示空白的FRAGMENT内容。它从未显示我在活动的OnCreate中在步骤1中添加的第一个片段。

请评论。我做错了什么?

由于

3 个答案:

答案 0 :(得分:46)

您不应该将第一个片段添加到Backstack,因为按回车键只会反转您执行的操作。因此,如果您更换片段并按回,它将反转您所做的替换。但是,如果您按下“.add()”片段事务,它只会将其删除并显示一个空白页面。所以我认为从backstack中删除第一个片段应该可以解决问题。尝试一下,让我知道!

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).commit();
    }

示例:

所以假设你有两个片段叫做 A & B

如果您.add() A 分段到页面,并且“addToBackStack()”(=保存操作的反向),您将保存REMOVE片段 A ,点击后退时的操作。

如果.replace()片段 A 片段 B ,以及“addToBackStack()”,您将保存删除 B < / strong>并在点击后添加 A 作为操作。

所以你明白为什么把你的第一个片段事务添加到backstack是不好的做法?它只会导致通过按下去除片段 A ,从而产生空白页面。希望这是足够的信息。

此外,一旦您将addToBackStack()删除到第一个片段,就不需要覆盖onBackPressed(),因为它将按照预期的方式工作。只有在Backstack中没有任何东西而没有首先显示空白页面时,它才会完成活动。

答案 1 :(得分:2)

你的专栏:

if(fm.getBackStackEntryCount() > 1){

应该是:

if (fm.getBackStackEntryCount() > 0) {

你在后台堆放3个碎片。关闭前两个条目后,backstack上的条目数等于1.因此,您要阻止自己检索添加到Backstack中的第一个片段。

答案 2 :(得分:0)

你正在使用它 manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

尝试使用它 manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

让我知道它是否适用于你