我有一个关于片段中上下文用法的问题。我的问题是我总是得到一个NullpointerException。这是我做的:
创建一个扩展SherlockFragment的类。在那个类中,我有另一个Helper类的实例:
public class Fragment extends SherlockFragment {
private Helper helper = new Helper(this.getActivity());
// More code ...
}
以下是另一个Helper类的摘录:
public class Helper {
public Helper(Context context) {
this.context = context;
}
// More code ...
}
每次我调用context.someMethod
(例如context.getResources())我都会得到一个NullPointerException。那是为什么?
答案 0 :(得分:22)
首次实例化Context
时,您尝试获取Fragment
。那时,它没有附加到Activity
,因此没有有效的Context
。
查看Fragment Lifecycle。 onAttach()
到onDetach()
之间的所有内容都包含对有效Context实例的引用。此Context实例通常通过getActivity()
代码示例:
private Helper mHelper;
@Override
public void onAttach(Activity activity){
super.onAttach (activity);
mHelper = new Helper (activity);
}
我在我的示例中使用了onAttach()
,@ LaurenceDawson使用了onActivityCreated()
。注意差异。由于onAttach()
已经传递了Activity
,我没有使用getActivity()
。相反,我使用了传递的参数。对于生命周期中的所有其他方法,您必须使用getActivity()
。
答案 1 :(得分:3)
您何时实例化助手课程?确保它在片段生命周期中的onActivityCreated()之后。
http://developer.android.com/images/fragment_lifecycle.png
以下代码应该有效:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
helper = new Helper(getActivity());
}
答案 2 :(得分:1)
getActivity()
被调用之前调用它,则 null
可以返回onAttach()
。我会推荐这样的东西:
public class Fragment extends SherlockFragment {
private Helper helper;
// Other code
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
helper = new Helper(activity);
}
}
答案 3 :(得分:0)
从<p>
迁移到android.support
后,我遇到了同样的问题。问题是androidx
库中的错误,描述如下:
https://issuetracker.google.com/issues/119256498
解决方案:
androidx
答案 4 :(得分:0)
您好,问题已经回答,但是通常如果您想在fragment或dialogFragment中获取上下文,请使用
protected lateinit var baseActivity: BaseActivity
protected lateinit var contextFragment: Context
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is BaseActivity) {
this.baseActivity = context
}
this.contextFragment = context
}
和在Java
中 protected BaseActivity baseActivity;
protected Context context;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
this.context = context;
if (context instanceof BaseActivity) {
this.baseActivity = (BaseActivity) context;
}
}