以编程方式添加Fragment的返回键导致空容器

时间:2012-10-16 16:37:56

标签: android fragment fragmenttransaction

我有一个支离破碎的布局问题,如果之前已经回答过,我真诚地道歉,而且我太笨了,无法找到它。我搜索了几个小时并没有得到任何东西(好吧,我有很多,但没有解决我的问题)。

所以这是我的设置:我有一个两个窗格布局,使用两个FrameLayouts作为我的片段的容器。 activity_listing.xml:

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

在打开应用程序(片段活动中的onCreate)时,使用FragmentTransaction以编程方式将名为Listing的片段添加到FrameLayout“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" />

但稍后将不会以编程方式替换或删除它。我只能添加()然后通过新的可见旧的。但这不是问题所在 - 只是对我的解释。

到目前为止,所有这些工作都应该如此,列表被创建和显示等,所以没有问题。但是:

当在启动时显示ListingFragment并按下后退键时,在最后位置FrameLayout“listing”被清空而不是回退到主屏幕!我认为它必须是因为我的ListingActivity的onCreate我显示一个空框架并添加()一个ListingFragment。所以后面的堆栈也有空框架。对?

我尝试将此情况解决为ListingActivity:

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

但不知怎的,这看起来不合适......看起来好像是一件坏事。

那么有没有办法在视图之前插入片段,空的FrameLayout被充气,所以没有空状态“返回”?或者是否可以从后堆栈中删除“空”状态,即使它不在后面?关于如何在击退“后退”之后避免空框架的任何其他想法?

非常感谢你提前做出的努力!

1 个答案:

答案 0 :(得分:11)

在onCreate中添加片段时,请勿调用ft.addToBackStack(null)。这告诉FragmentManger你希望能够跳回到那个片段之前还有另一个状态。