Reputation: 7331
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
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
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
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
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