9

我有一个碎片化的布局问题,如果之前已经回答过,我真诚地道歉,我太笨了,找不到它。我搜索了好几个小时却一无所获(好吧,我得到了很多但没有解决我的问题)。

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

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

打开应用程序时(片段活动中的 onCreate),使用 FragmentTransaction 以编程方式将名为 Listing 的片段添加到 FrameLayout“列表”中。

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" />

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

到目前为止,所有这些都正常工作,创建和显示列表等,所以那里没有问题。但:

当ListingFragment在启动时显示并且我按下返回键时,在最后一个位置FrameLayout“列表”被清空而不是回到主屏幕!我认为这一定是因为我的 ListingActivity 的 onCreate 我显示了一个空框架并向其添加()一个 ListingFragment。所以后栈中也有空帧。对?

我尝试通过这个来解决ListingActivity的情况:

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

但不知何故,这看起来或感觉不对……它看起来像是一个糟糕的解决方法。

那么有什么方法可以在带有空 FrameLayout 的视图膨胀之前插入片段,因此没有空状态可以“返回”到?或者是否可以从后台堆栈中删除“空”状态,即使它不在其中?关于如何在点击“后退”后避免空框的任何其他想法?

非常感谢您提前付出的努力!

4

1 回答 1

11

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

于 2012-10-16T18:12:54.823 回答