回调中的片段上下文

时间:2017-03-01 02:23:42

标签: android

以下代码适用于我的设备,但我看到了生产中的崩溃。 我已将活动上下文传递到newInstance

我应该如何在PreferenceManager.getDefaultSharedPreferences()使用上下文?

这在不同设备上的表现会有所不同吗? (相同的Android版本)

public class MyFragment extends Fragment {
    ...

    private api myApi;
    private Context context;

    public static MyFragment newInstance(Context context, ...) {
        MyFragment frag = new MyFragment();
        frag.context = context;
        return frag;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...

        api = new MyApi(this.context);
        update();

    }

    private update() {
        api.getData(new Callback<GenericMobileResponse<ArrayList<MyData>>>() {
            @Override public success(GenericMobileResponse<ArrayList<MyData>> genericMobileResponse, Response response) {
                ArrayList<MyData> data = genericMobileResponse.getData();
                updateItems(data);
            }
        })
    }

    private updateItems(ArrayList<MyData>) {
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.context); //Crash!  getContext()? this.context? getActivity()? getApplicationContext()
    }
}

2 个答案:

答案 0 :(得分:0)

试试这个:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...

    api = new MyApi(this.context);
    update(this.context);// or just use inflater.getContext()

}

private update(final Context context) {
    api.getData(new Callback<GenericMobileResponse<ArrayList<MyData>>>() {
        @Override public success(GenericMobileResponse<ArrayList<MyData>> genericMobileResponse, Response response) {
            ArrayList<MyData> data = genericMobileResponse.getData();
            updateItems(context,data);
        }
    })
}

private updateItems(Context context, ArrayList<MyData>) {
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
}

答案 1 :(得分:0)

我为您的代码添加了一些修复程序。让我们看看会发生什么。

public class MyFragment extends Fragment {
    ...

    private api myApi;

    public static MyFragment newInstance(Context context, ...) {
        MyFragment frag = new MyFragment();
        return frag;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...

        api = new MyApi(getContext());
        update();

    }

    private update() {
        api.getData(new Callback<GenericMobileResponse<ArrayList<MyData>>>() {
            @Override public success(GenericMobileResponse<ArrayList<MyData>> genericMobileResponse, Response response) {
                ArrayList<MyData> data = genericMobileResponse.getData();
                updateItems(data);
            }
        })
    }

    private updateItems(ArrayList<MyData>) {
        // always use getContext() to retrieve the context.
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
    }
}