Java 为什么片段中的上下文为空?
我有一个关于片段中上下文用法的问题。我的问题是我总是得到一个NullpointerException。以下是我的工作: 创建一个扩展SherlockFragment的类。在该类中,我有另一个助手类的实例:Java 为什么片段中的上下文为空?,java,android,nullpointerexception,android-context,Java,Android,Nullpointerexception,Android Context,我有一个关于片段中上下文用法的问题。我的问题是我总是得到一个NullpointerException。以下是我的工作: 创建一个扩展SherlockFragment的类。在该类中,我有另一个助手类的实例: public class Fragment extends SherlockFragment { private Helper helper = new Helper(this.getActivity()); // More code ... } public class
public class Fragment extends SherlockFragment {
private Helper helper = new Helper(this.getActivity());
// More code ...
}
public class Helper {
public Helper(Context context) {
this.context = context;
}
// More code ...
}
下面是另一个助手类的摘录:
public class Fragment extends SherlockFragment {
private Helper helper = new Helper(this.getActivity());
// More code ...
}
public class Helper {
public Helper(Context context) {
this.context = context;
}
// More code ...
}
每次调用
context.someMethod
(例如context.getResources())时,我都会得到一个NullPointerException。为什么会这样?什么时候实例化助手类?确保它位于片段生命周期中的onActivityCreated()之后
以下代码应该可以工作:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
helper = new Helper(getActivity());
}
当
片段
第一次实例化时,您正试图获取上下文
。当时,它没有附加到活动
,因此没有有效的上下文
看一看这张照片。onAttach()
到onDetach()
之间的所有内容都包含对有效上下文实例的引用。此上下文实例通常通过getActivity()
代码示例:
private Helper mHelper;
@Override
public void onAttach(Activity activity){
super.onAttach (activity);
mHelper = new Helper (activity);
}
在我的示例中,@LaurenceDawson使用了onActivityCreated()
。注意区别。因为onAttach()
已经获得了一个传递给它的活动,所以我没有使用getActivity()
。相反,我使用了通过的论点。对于生命周期中的所有其他方法,必须使用getActivity()
getActivity()
如果在调用onAttach()
之前调用它,则可以返回null
。我想推荐如下:
public class Fragment extends SherlockFragment {
private Helper helper;
// Other code
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
helper = new Helper(activity);
}
}
您好,问题已经回答了,但一般来说,如果您想在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
}
在爪哇
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;
}
}
看起来SherlockFragment#activity
在初始化片段时未设置,而是在稍后的阶段注入,因此在构造函数中为null
。@user2426316我添加了一个示例。我的和LaurenceDawson的都能用。