Fragment中獲取Context對象的兩種方法

我們在使用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類型的對象。

2.獲取Application對象
如下自己寫一個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();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章