我們在使用Fragment的時候經常需要傳遞Context類型的參數,【Android用的比較多的就是下面幾個導航按鈕,點擊切換fragment(之前Android studio2.0以前是可以new fragment(context)時傳遞Context,但後來升級了studio2.1.2之後,new fragment對象時傳遞context會報錯,不得不想別的法子了)】而Fragment自己又不是一個Context類型的對象,於是我們有下面兩種方法獲取Context對象。
一、兩種方法介紹
1.this.getActivity()(可以不寫this.)
在Fragment中直接調用getActivity()方法,可以直接得到Fragment依附的Activity,而Activity是一個Context類型的對象。
如下自己寫一個MyApplication類繼承Application,通過getInstance獲取一個Application類型的對象,也是Context對象。
public class MyApplication extends Application { private static MyApplication mInstance; /** * 獲取context * @return */ public static Context getInstance() { if (mInstance == null) { mInstance = new MyApplication(); } return mInstance; } }
二、兩種方法比較
1.this.getActivity()
- 優點:不需要寫MyApplication類
-
缺點:
Fragment
很容易被銷燬,調用getActivity()
方法會報空指針錯誤(注意:並不是getActivity()
返回值爲null
,而是this.getActivity()
中的this
,也就是Fragment
自己是null
,因爲它已經被銷燬了)
2.獲取Application對象
-
優點:不會遇到類似
this.getActivity()
的空指針問題 -
缺點:某些情況下的
Context
必須是Activity
,特別是實例化Dialog
等需要依附於一個Activity
的可視化的對象時傳參必須是Activity
對象(Toast
是Android的一種通知機制,不需要依附於Activity
)
三、兩全其美的解決方案
1.MyApplication是一定要寫的
2.寫一個如下的BaseFragment類:所有的Fragment
都繼承這個BaseFragment
,直接通過getContext()
方法即可得到Context
對象,當然實例化Dialog
等需要依附於Activity
的對象時,還是老老實實的getActivity()
吧
public class BaseFragment extends Fragment { private Activity activity; public Context getContext() { if (activity == null) { return MyApplication.getInstance(); } return activity; } @Override public void onAttach(Context context) { super.onAttach(context); activity = getActivity(); } }