我有一个支离破碎的布局问题,如果之前已经回答过,我真诚地道歉,而且我太笨了,无法找到它。我搜索了几个小时并没有得到任何东西(好吧,我有很多,但没有解决我的问题)。
所以这是我的设置:我有一个两个窗格布局,使用两个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被充气,所以没有空状态“返回”?或者是否可以从后堆栈中删除“空”状态,即使它不在后面?关于如何在击退“后退”之后避免空框架的任何其他想法?
非常感谢你提前做出的努力!
答案 0 :(得分:11)
在onCreate中添加片段时,请勿调用ft.addToBackStack(null)
。这告诉FragmentManger你希望能够跳回到那个片段之前还有另一个状态。