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();