以编程方式添加的片段上的后退键导致空容器

Posted

技术标签:

【中文标题】以编程方式添加的片段上的后退键导致空容器【英文标题】:Back key on programmatically added Fragment leads to empty container 【发布时间】:2012-10-06 19:58:36 【问题描述】:

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

所以这是我的设置:我有一个两个窗格布局,使用两个 FrameLayouts 作为我的片段的容器。 activity_listing.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 的视图膨胀之前插入片段,因此没有空状态可以“返回”到?或者是否可以从后台堆栈中删除“空”状态,即使它不在其中?关于如何避免点击“返回”后出现空帧的任何其他想法?

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

【问题讨论】:

尝试从 onCreate 的添加事务中删除“ft.addToBackStack(null)”。那么你不应该对 onbackpressed 做任何事情 你是对的!完美的!您能否将其发布为答案,以便我将其标记为正确的答案?我现在真的觉得有点傻…… 【参考方案1】:

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

【讨论】:

以上是关于以编程方式添加的片段上的后退键导致空容器的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 MapView 并添加标记导致片段中出现空指针异常

如何以编程方式在其上添加 UINavigationBar 和后退按钮

以编程方式创建的后退按钮没有箭头

以编程方式导航控制器后退按钮标题(无情节提要)[重复]

如何以编程方式触发科尔多瓦的后退按钮事件

以编程方式创建的后退按钮未显示在导航栏中?