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

问题描述 投票:10回答:4

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

java android nullpointerexception android-context
4个回答
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()


3
投票

你什么时候实例化Helper类?确保它位于Fragment生命周期中的onActivityCreated()之后。

http://developer.android.com/images/fragment_lifecycle.png

以下代码应该有效:

@Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    helper = new Helper(getActivity());
  }

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

0
投票

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"
© www.soinside.com 2019 - 2024. All rights reserved.