Fragment.setArguments()
在我們平常開發的時候Fragment是經常使用的,而我們創建一個Fragment對象的時候一般都會 通過 new Fragment()構造方法來實現,如果要傳遞參數我們一般會重載構造方法,例如 new Fragment(Parameter p)。
但是這樣的做法是不被提倡的,如果你重載構造函數之后,系統會有一個warning,如下:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead- 1
這個警告的意思就是,盡量避免使用 不是默認的構造函數(也就是我們重載的構造函數):通過 使用默認的構造函數 加上 Fragment.setArguments(Bundle)來取代。
接下來我們來看一下這兩種方式:
重載的構造函數:
public class MyFragment extends Fragment { public MyFragment(MyParameter p){ //將參數保存起來 } }如果在創建Fragment的時候,使用?MyFragment mf = new MyFragment(parameter)?
來傳遞參數。
通過Fragment.setArguments(Bundle)
public class MyFragment extends Fragment { public static MyFragment newInstance(int someInt) { MyFragment myFragment = new MyFragment(); Bundle args = new Bundle(); args.putInt("someInt", someInt); myFragment.setArguments(args); return myFragment; } }?
這種方式在創建Fragment的時候,使用MyFragment mf = MyFragment.newInstance(paramter)?來傳遞參數。
分析
乍一看這兩種方法似乎沒有什么本質區別,但是實際上 方法一(重載構造函數)是有一個隱患的。
根據Android文檔說明,當一個fragment重新創建的時候,系統會再次調用 Fragment中的默認構造函數。?注意這里:是?默認構造函數。
這句話更直白的意思就是:當你小心翼翼的創建了一個帶有重要參數的Fragment的之后,一旦由于什么原因(橫豎屏切換)導致你的Fragment重新創建?!?很遺憾的告訴你,你之前傳遞的參數都不見了,因為recreate你的Fragment的時候,調用的是默認構造函數。
對比
而使用系統推薦的 Fragment.setArguments(Bundle)來傳遞參數。就可以有效的避免這一個問題,當你的Fragment銷毀的時候,其中的Bundle會保存下來,當要重新創建的時候會檢查Bundle是否為null,如果不為null,就會使用bundle作為參數來重新創建fragment.
疑問:
當fragment重建的時候,怎么獲取之前的參數呢??
以上面的代碼為例:我們可以重寫 fragment的onCreate()方法。
?
當fragment重現創建,調用onCreate方法,然后就可以取得之前的參數了,然后就可以盡情使用了。
bundle是如何將參數保存下來,然后重建的時候再利用呢?
這個問題可以移步這篇博客。
注意:
setArguments can only be called before the Fragment is attached to the Activity.
setArguments方法的調用必須要在Fragment與Activity關聯之前。
這句話可以這樣理解,setArgument方法的使用必須要在FragmentTransaction 的commit之前使用。?
詳見:連接。
參考資料1:
參考資料2
參考資料3
轉載于:https://www.cnblogs.com/holyday/p/7505559.html
總結
以上是生活随笔為你收集整理的Fragment.setArguments()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何编写更好的SQL查询:终极指南-第三
- 下一篇: 数据结构之堆的插入、取值、排序(细致讲解