user2426316
user2426316

Reputation: 7331

Why is my context in my Fragment null?

I have got a question regarding the usage of context in a fragment. My problem is that I always get a NullpointerException. Here is what i do:

Create a class that extends the SherlockFragment. In that class I have an instance of another Helper class:

public class Fragment extends SherlockFragment { 
    private Helper helper = new Helper(this.getActivity());

    // More code ...
}

Here is an extract of the other Helper class:

public class Helper {
    public Helper(Context context) {
        this.context = context;
    }
    // More code ...
}

Everytime I call context.someMethod (e.g. context.getResources() ) I get a NullPointerException. Why is that?

Upvotes: 14

Views: 20977

Answers (4)

Erfan Eghterafi
Erfan Eghterafi

Reputation: 5585

Hi the question has answered, but generally if you want to get context in fragment or dialogFragment use this

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
}

and in 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;
    }
}

Upvotes: 0

Taormina
Taormina

Reputation: 36

getActivity() can return null if it gets called before onAttach() gets called. I would recommend something like this:

public class Fragment extends SherlockFragment { 

    private Helper helper;

    // Other code

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        helper = new Helper(activity);
    }
} 

Upvotes: 1

A--C
A--C

Reputation: 36449

You're attempting to get a Context when the Fragment is first instantiated. At that time, it is NOT attached to an Activity, so there is no valid Context.

Have a look at the Fragment Lifecycle. Everything between onAttach() to onDetach() contain a reference to a valid Context instance. This Context instance is usually retrieved via getActivity()

Code example:

private Helper mHelper;

@Override
public void onAttach(Activity activity){
   super.onAttach (activity);
   mHelper = new Helper (activity);
}

I used onAttach() in my example, @LaurenceDawson used onActivityCreated(). Note the differences. Since onAttach() gets an Activity passed to it already, I didn't use getActivity(). Instead I used the argument passed. For all other methods in the lifecycle, you will have to use getActivity().

Upvotes: 30

Ljdawson
Ljdawson

Reputation: 12229

When are you instantiating your Helper class? Make sure it's after onActivityCreated() in the lifecycle of the Fragment.

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

The following code should work:

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

Upvotes: 4

Related Questions