3

我希望有人能清理我在这里做错了什么。我在横向模式范例中的平板电脑上使用了一个共同的主细节。唯一需要注意的是,主要部分中的某些元素在“明细”部分中打开了FragA,而其他元素则在详细部分中打开了FragB。除了切换片段的实际过程外,一切看起来都很好。无论哪个碎片首先显示是唯一显示的碎片。我一直在使用replace方法将它们交换出来,并且我可以发现所有关于主题的SO注释都指出,如果我已经在XML中添加了详细信息片段,这将不起作用。不幸的是,这不适用于我,因为我动态添加所有片段。我的代码如下所示:Android的片段替换不会做任何事情

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对象作出正确已在FrameLayout里与ID/details_fragment目标这表现在如果是第一个加入的话,任何一个都可以正常工作。

编辑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); 
+0

显示布局文件 – 2013-04-04 21:46:41

+0

,但我不认为它应该的问题因为正如我所提到的,第一个片段添加(不管它是哪一个片段)显示正确 – akhalsa 2013-04-04 21:57:42

回答

1

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

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

我想你的第一个代码示例将执行正确的替换操作,如果你注释掉(删除)双加:在编辑中添加

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(); 
相关问题