2012-03-28 96 views
7

我有橫向模式的佈局,顯示在左側和右側的FrameLayout裏一個ListView。當從列表中選擇一個項目的另一個片段被添加到的FrameLayout無法從FrameLayout中刪除片段?

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
    myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commitAllowingStateLoss(); 
} 

後來我按刪除列表中的視圖,並刪除列表中的最後一個項目,我嘗試刪除片段,使任何顯示,但它不起作用,我的片段仍然在屏幕上。去除代碼:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.remove(myFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
ft.commitAllowingStateLoss(); 

爲什麼它沒有被從視圖中刪除任何想法?

+3

我有完全相同的問題。有沒有達成任何決議? – Jared 2013-03-07 04:44:31

回答

3

你在聲明XML片段?引用來自谷歌的Dianne Hackborn:

定義XML中的片段 主要用於將要停留的事情。如果你是 要添加和刪除,你應該始終做到動態。

希望它有助於

+0

我認爲他指的是在XML佈局中使用標籤。我沒有使用它,我使用FrameLayout作爲佔位符並動態更新放入它的片段。我可能會嘗試使用在您引用的線程中提到的F​​ragmentTransaction.hide()方法。 – DaveJohnston 2012-03-28 18:45:11

+0

那麼這個API是不好的。你做了一個簡單的'remove()'調用,而你期望它做的最基本的事情是行不通的。 – milosmns 2016-05-23 17:18:37

+0

它可以用於編程添加顯式事務的碎片。 – Blackbelt 2016-05-23 17:24:59

0

當你發現你的片段,該標識你有參考片段容器不分片本身。 使用,當你addiing片段,然後通過TAG找到一個TAG:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag"); 
11

@DaveJohnston我曾嘗試你的刪除片段的代碼,我剛模....謝謝:)

嘿,我不知道這爲解決您的問題或沒有,但你嘗試這種方式,將工作:

方法添加片段:

YourFragment yourFrament; 

//Add your Fragment 
public void addYourFragment(){ 
yourFragment = new YourFragment(); 

FragmentTransaction transation = getSupportFragmentManager().beginTransaction(); 
transation.replace(R.id.yourFlowLayout, yourFragment); 

     transation.commit(); 

} 

方法刪除片段:

//Remove Fragment 
    public void removeYourFragment(){ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      if (yourFragment != null) {   
       transaction.remove(yourFragment); 
       transaction.commit(); 
       transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
       yourFragment = null; 
      } 
    } 
+0

如果我寫transaction.remove(null)會發生什麼?它會刪除堆棧中最頂部的碎片嗎?或會發生什麼? – 2016-04-07 09:19:40

0

我有一個非常很難找到,從而可以參照時通過XML不設<fragment>,但FragmentTransaction<FrameLayout>確實設置每Fragment動態發生這個問題。

簡化格呂的解決方案,解決了什麼對我來說是簡單地增加.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)我更換交易和它的工作!以前的片段現在實際上被隱藏起來了。

我想像其他的轉換將正常工作。

0
private static String TAG_FRAGMENT="MyFragment"; 
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
     myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment,TAG_FRAGMENT); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(TAG_FRAGMENT); 
    ft.commit(); 
} 

更換您的片段用ft.addToBackStack(null)方法後,輕鬆地刪除您的片段時。

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 

if(fragment != null) 
getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 
0

如果您有沒有在該FrameLayout更換Fragment去除Fragment?您可以刪除到正規的呼叫面前犯了FragmentTransaction.TRANSIT_FRAGMENT_CLOSE上有一個單獨的去除過渡代替提交。

Fragment removeThisFragment;//Keep a reference to the fragment you want to remove 
... 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

// This fragment "sometimes" do not get replaced so we remove it here if it's added. 
     if(removeThisFragment!=null&&removeThisFragment.isAdded()) { 
      transaction = fragmentManager.beginTransaction(); 
      transaction.remove(removeThisFragment); 
      transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
      transaction.commitAllowingStateLoss(); 
     } 

     // update the main content by replacing fragments 
     transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, TAG_MAIN_FRAGMENT).commit(); 

但我建議,試圖找出第一,爲什麼片段不是擺在首位更換,檢查它是否在做一些繁重的工作或東西保持它從越來越更換?但如果您需要快速臨時修復,請嘗試上面的代碼。