我有一个关于片段中上下文用法的问题。我的问题是我总是得到一个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。这是为什么?
当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()
。
你什么时候实例化Helper类?确保它位于Fragment生命周期中的onActivityCreated()之后。
http://developer.android.com/images/fragment_lifecycle.png
以下代码应该有效:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
helper = new Helper(getActivity());
}
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);
}
}
从android.support
迁移到androidx
后我遇到了同样的问题。问题是androidx
库中的一个错误,在这里描述:https://issuetracker.google.com/issues/119256498
解:
// Crashing:
implementation "androidx.appcompat:appcompat:1.1.0-alpha01"
// Working:
implementation "androidx.appcompat:appcompat:1.1.0-alpha03"