2013-10-16 49 views
15

您好我正在開發Android應用程序,我正在使用我使用單個Activity和3片段。所以考慮我有3個片段A B C.當我從A切換到B時,我將Fragment添加到backstack並將B與C相匹配。現在,當我從C中單擊時,它會顯示B和B以及類似的A。片段的onResume()不從後臺彈出時調用

但事情是,當我從C到B或B到A時,它不會調用onResume()Fragment的任何其他生命週期方法。

我想要爲每一個做什麼Fragment我在ActionBar有不同的標題。所以,在我的代碼中,當我從A移動到B或B移動到C時,我正在改變片段內的活動標題。但是當我點擊它時,它不會根據那個改變。

實際問題是什麼?爲什麼在從後臺彈出後,它不會爲Fragment調用onResume()?我該如何解決這個問題?需要幫忙。謝謝。

+0

僅當活動恢復時才調用片段的onResume()。所以這不會幫助你。即使我現在也面臨類似的問題。您可以實現'OnBackStackChangedListener'並獲取堆棧頂部的片段名稱,並根據該名稱設置操作欄標題。 – Uma

回答

-1

嘗試更改片段的onCreateView()的標題。

+0

但是,當我從堆棧彈出片段,然後它不調用任何生命週期方法。那麼我應該感謝你的幫助。 – nilkash

+0

您需要更改片段的onCreateView方法中的標題。當你彈出或添加片段堆棧oncreateview方法被調用,然後你根據你的片段類設置標題。 –

+0

@HarshitRathi我試過這個,而@nilkash表示''onCreateView()'不會被調用,當一個片段從後面的棧中彈出並且新的變得可見時。 – Franco

10

嘗試在FragmentTransaction上使用replace方法代替add。這對我的工作:當Activity恢復

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.fragment_container, fragment); 
ft.addToBackStack(null); 
ft.commit(); 
+0

這工作。現在可能應該是被接受的答案。 – RajV

+0

只有在調用Activities onResume()或onPause()時,纔會調用片段onResume()或onPause()。它們與活動緊密相連。如果你調用replace,onStop()會被調用。 – Nepster

16

FragmentonResume()只調用。所以這不會幫助你。即使我現在也面臨類似的問題。您可以實現OnBackStackChangedListener並獲取堆棧頂部的片段名稱,並根據該名稱設置標題。

private FragmentManager.OnBackStackChangedListener getListener() 
{ 
    FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener() 
    { 
     public void onBackStackChanged() 
     { 
      FragmentManager manager = getFragmentManager(); 

      if (manager != null) 
      { 
       if(manager.getBackStackEntryCount() >= 1){ 
        String topOnStack = manager.getBackStackEntryAt(manager.getBackStackEntryCount()-1).getName(); 
        Log.i("TOP ON BACK STACK",topOnStack); 
       } 
       } 
      } 
    }; 

    return result; 
} 
1

將此代碼放入您的片段中。

@Override 
public void setUserVisibleHint(boolean visible) { 
     super.setUserVisibleHint(visible); 
     if (visible && isResumed()) { 
      onResume(); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (!getUserVisibleHint()) { 
      return; 
     } 
     setData(); 
    } 
+0

不工作:(。 –

0

正如其他人已經說過,onResume()當活動本身恢復纔會被調用,這樣就不會在所有幫助。

你需要檢查,如果你添加新的片段,或在您的交易片段替換現有的片段:

  • 如果replace()以前的片段,片段以前將從頭開始重建時,你回到它,所以onCreateView()將被再次調用,並且你可以在那裏更新你的工具欄標題。你可能已經做到了。

  • 如果你add()一個新的片段,前一個片段仍然存在,只有不可見。當你回到它時,你需要從後端堆棧中獲取最後一個條目(在片段管理器中使用getBackStackEntryCount()getBackStackEntryAt()),獲取相應的片段對象(在片段管理器中使用findFragmentByTag()),將該片段轉換爲一些基類,你的所有片段將繼承,並調用一個自定義方法,例如onVisible(),在該片段上。基類中的默認實現onVisible()什麼都不做。覆蓋每個片段以更新工具欄標題,FAB以及其他所需的內容。我還撥打onVisible()來自onResume()以避免代碼重複。