为什么我的Fragment中的上下文为null?

时间:2013-08-09 20:14:19

标签: java android nullpointerexception android-context

我有一个关于片段中上下文用法的问题。我的问题是我总是得到一个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。那是为什么?

5 个答案:

答案 0 :(得分:22)

首次实例化Context时,您尝试获取Fragment。那时,它没有附加到Activity,因此没有有效的Context

查看Fragment LifecycleonAttach()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;
    }
}