2017-03-01 64 views
0

下面的代碼適用於我的設備,但是我看到了生產中的崩潰。 我將活動內容傳遞到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() 
    } 
} 

回答

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); 
} 
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()); 
    } 
}