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