通过程序添加的Fragment中的返回键导致容器为空

9

我有一个关于碎片布局的问题,如果之前已经回答过并且我太傻不能找到它,那我真诚地道歉。我搜索了几个小时,什么都没找到(好吧,我找到了很多,但是没有解决我的问题)。

这是我的设置:我使用两个FrameLayout作为碎片的容器来实现双窗格布局。activity_listing.xml:

<FrameLayout android:id="@+id/listing" />
<FrameLayout android:id="@+id/details" />

打开应用程序时(在片段的活动中的 onCreate 方法中),通过 FragmentTransaction 编程方式向 FrameLayout "listing" 添加名为 Listing 的片段。
public class ListingActivity extends FragmentActivity
        implements ListingFragment.Callbacks {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listing);

    // Displaying the first listing here ...
    Fragment fragment = new ListingFragment();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.listing, fragment);
    ft.addToBackStack(null);
    ft.commit();
    ...
}

这个ListingFragment在运行时被替换了几次,所以我必须创建它而不是在XML中定义。我尝试过后者,使用了

<fragment android:name="com.example.app.ListingFragment" />

但是,如果不进行编程替换或删除,它将无法在以后程序化地被替换或删除。我只能添加(),然后旧的通过新的是可见的。但这不是问题所在 - 只是我方法的解释。

到目前为止,所有工作都按照预期进行,Listing已创建并显示等,因此没有问题。但是:

当启动ListingFragment并按下返回键时,在最后一个位置的FrameLayout“listing”被清空,而不是回到Homescreen!我想这是因为我在ListingActivity的onCreate中显示一个空框架并添加()了一个ListingFragment。因此,后退堆栈中也有一个空白框架。 对吗?

我尝试通过以下方法解决此情况:

@Override
public void onBackPressed() {
    super.onBackPressed();
    if(getSupportFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    }
}

但是这样做看起来或感觉并不正确……它看起来像一个糟糕的解决方案。

那么有没有办法在填充空FrameLayout的视图之前插入片段,以便没有空状态可以“返回”?或者是否可能从回退堆栈中删除“空”状态,尽管它不在其中?还有其他避免点击“返回”后出现空框架的想法吗?

非常感谢您的努力!


2
尝试从onCreate中的添加事务中删除"ft.addToBackStack(null)",然后您就不必在onBackPressed中做任何事情。 - toadzky
你说得对!太好了!你能把它发表为答案吗,这样我就可以标记它为正确的了吗?现在我真的感觉有点傻... - Bobby Tables
1个回答

11
不要在onCreate中添加Fragment时调用ft.addToBackStack(null)。这会告诉FragmentManger您在该片段之前有另一个状态,您希望能够返回到该状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接