2016-06-16 96 views
0

我用setRetainInstance(true)創建了片段,並在第一次啓動後試圖找到我的片段。第二次無法通過標籤找到片段Android

private void showHomeFragment() { 
    mHomeFragment = (HomeFragment) getSupportFragmentManager().findFragmentByTag(HomeFragment.class.getSimpleName()); 

    if (mHomeFragment == null) { 
     mHomeFragment = new HomeFragment(); 
    } 

    showFragment(mHomeFragment, false); 
} 

@Override 
public void showFragment(Fragment fragment, boolean addToBackStack) { 

    @SuppressLint("CommitTransaction") FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.main_container, 
        fragment, 
        fragment.getClass().getSimpleName()); 

    if (addToBackStack) { 
     transaction.addToBackStack(fragment.getClass().getSimpleName()); 
    } 

    transaction.commit(); 

    getSupportFragmentManager().executePendingTransactions(); 
} 

我啓動這個HomeFragment比去HomeFragment的另一個片段,而我無法通過標記找到它。有人能幫我弄清楚是什麼問題嗎?

在此先感謝!

+0

您可以使用'getSupportFragmentManager.popBackStack()'導航回到'HomeFragment',這是按下後退按鈕的程序化等價物。 –

+0

@ krislarson但問題是爲什麼我不能通過標記找到它,如果片段保留實例的真實? –

回答

1

您正在將參數addToBackStack設置爲false,而不是將替換操作放在背堆棧上。因此,FragmentManager可能會釋放對該片段的引用,因爲它不必撤消該事務,因此沒有理由繼續保留該片段。我不得不嘗試一下,但我確信這就是發生了什麼。

要說清楚,setRetainInstance(true)與此邏輯無關。這樣做是爲了防止碎片被破壞,然後在配置更改時重新創建。一旦你替換了HomeFragment而它不在背面堆疊中,FragmentManager就沒有保留這個片段。