2016-06-11 86 views
1

我有一個始終可見的片段。我不明白爲什麼我應該使用bundle從活動中傳遞數據。爲什麼使用bundle將數據傳遞給fragment?

大部分問題這裏推薦傳送數據的這個方法:

Bundle bundle=new Bundle(); 
bundle.putString("name", "From Activity"); 
Fragmentclass fragobj=new Fragmentclass(); 
fragobj.setArguments(bundle); 

我更喜歡在活性的OnCreate函數創建片段對象,然後使用此對象來顯示的片段(FragmentTransaction.add)。因爲我有refence這個片段,我可以在其中創建創建功能showName(),從這樣的活動稱之爲:

myFragment.showName("name"); 

有什麼不對這種方法?

+4

提示:當框架需要重新創建片段時會發生什麼? – laalto

回答

1

這種設置一個關閉數據值的方法沒有什麼問題,只需要注意確保您想要設置名稱的視圖實際上存在於調用showName方法的位置。

使用Bundles傳遞信息的部分原因是它們可以使用鍵保存所有類型的數據,並且它們可以很容易地用於在設備旋轉期間傳遞視圖狀態。最終,這是一個偏好問題,正是你的用例。

7

Android documentation狀態:

每一個片段必須有一個空的構造,所以可以恢復其活性的狀態下被實例化。強烈建議子類沒有帶參數的其他構造函數,因爲這些構造函數在重新實例化時不會被調用;相反,調用者可以使用setArguments(Bundle)提供參數,然後使用getArguments()由Fragment檢索參數。

這就是爲什麼它是更好地使用捆綁,並設置片段的這樣的參數,更容易爲系統時的片段重新實例化,以恢復其值。現在


,我不會用myFragment.showName("name");,因爲你不知道,如果片段的生命週期已經結束(連接到活動和膨脹的意見),所以相反,我會叫showName("name")onActivityCreatedonViewCreated回調。

應用程序通常不應該實現構造函數。第一個應用程序代碼可以在片段準備好使用的地方運行,位於onAttach(Activity)中,該片段實際上與其活動相關聯。一些應用程序可能也想要實現onInflate(Activity,AttributeSet,Bundle)從佈局資源中檢索屬性,但應該注意這裏,因爲這會發生碎片附加到其活動。

相關問題