【问题标题】:Android fragment replace doesn't do anythingAndroid片段替换不做任何事情
【发布时间】:2013-03-27 04:23:09
【问题描述】:

我希望有人能澄清我在这里做错了什么。我在横向模式范例的平板电脑上有一个共同的主细节。唯一需要注意的是,master 中的一些元素在 Detail 部分打开 FragA,而其他元素在 detail 部分打开 FragB。一切似乎都很好,除了切换片段的实际过程。首先显示的片段是唯一显示的片段。我一直在使用 replace 方法将它们换出,并且我能找到的所有关于该主题的 SO cmets 都指出,如果我在 XML 中添加了详细信息片段,这将不起作用。不幸的是,这不适用于我,因为我动态添加了所有片段。我的代码如下所示:

FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ?  getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
         FragmentTransaction ft = getFragmentManager().beginTransaction();
         if(frag.mFragment == null){
             frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
             ft.add(frag.target.getId(), frag.mFragment);
             ft.commit();
             ft = getFragmentManager().beginTransaction();
         } 
         ft.replace(frag.target.getId(), frag.mFragment);
         ft.commit();

这是添加这些片段的唯一代码,似乎发生的情况是,首先添加的片段可以正常工作,但替换方法根本不起作用。无论是哪个片段,都只是……仍然存在。

有谁知道我做错了什么?

编辑

布局文件的相关部分如下所示:

    <LinearLayout
    android:id="@+id/fragments_holder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <FrameLayout
        android:id="@+id/list_fragment"
        android:layout_width="0dp"
        android:layout_weight="0.39"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/details_fragment"
        android:layout_height="match_parent"
        android:layout_weight="0.61"
        android:layout_width="0dp" />

    <!-- ADD METADATA VIEW HERE -->

</LinearLayout>

两个 FragmentInfo 对象都正确地具有带有 id/details_fragment 的 FrameLayout 目标,这可以通过以下事实证明:如果它是第一个添加的,则任何一个都可以正常工作。

编辑 2 注意:使用此代码块也有完全相同的结果:

FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ?  getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
         FragmentTransaction ft = getFragmentManager().beginTransaction();
         if(frag.mFragment == null){
             frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
             ft.add(frag.target.getId(), frag.mFragment);
             //ft.commit();
             //ft = getFragmentManager().beginTransaction();
         } else{
             ft.replace(frag.target.getId(), frag.mFragment);
         }
         //ft.replace(frag.target.getId(), frag.mFragment);
         ft.commit();
         detailsContainer.setFragmentInfo(frag);

【问题讨论】:

  • 在编辑中添加,虽然我认为这并不重要,因为正如我所提到的,添加的第一个片段(无论它是哪个片段)正确显示

标签: android android-fragments master-detail fragmenttransaction


【解决方案1】:

替换实际上与一系列删除和添加操作相同。即使容器是空的,替换仍然可以安全使用(与简单的添加相同)。我更喜欢使用显式删除和添加操作,因为这样更容易推理。

我认为您的代码示例在开始时有一些问题,但是一旦初始化完成,似乎有一些正确的路径通过它。在第一个代码示例中,您使用相同的片段实例调用添加和替换(在尚未创建片段的情况下)。在您的第二个代码示例中,您不会删除旧片段(在尚未创建要添加的第二个片段的情况下)。

如果您注释掉(删除)双重添加,我认为您的第一个代码示例将正确执行替换操作:

FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ?  getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
         FragmentTransaction ft = getFragmentManager().beginTransaction();
         if(frag.mFragment == null){
             frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
             // ft.add(frag.target.getId(), frag.mFragment);
             // ft.commit();
             // ft = getFragmentManager().beginTransaction();
         } 
         ft.replace(frag.target.getId(), frag.mFragment);
         ft.commit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多