Почему мой контекст в моем фрагменте равен нулю?

У меня вопрос по поводу использования контекста во фрагменте. Моя проблема в том, что я всегда получаю исключение NullpointerException. Вот что я делаю:

Создайте класс, расширяющий SherlockFragment. В этом классе у меня есть экземпляр другого вспомогательного класса:

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. Почему это?


person user2426316    schedule 09.08.2013    source источник
comment
Похоже, что SherlockFragment#activity не устанавливается при инициализации вашего фрагмента, а вводится на более позднем этапе, таким образом, null в конструкторе.   -  person Luiggi Mendoza    schedule 10.08.2013


Ответы (4)


Вы пытаетесь получить Context при первом создании экземпляра Fragment. В то время он НЕ был присоединен к Activity, поэтому нет действительного Context.

Ознакомьтесь с жизненным циклом фрагмента. Все, что находится между onAttach() и onDetach(), содержит ссылку на действительный экземпляр контекста. Этот экземпляр контекста обычно извлекается через getActivity()

Пример кода:

private Helper mHelper;

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

В моем примере я использовал onAttach(), @LaurenceDawson использовал onActivityCreated(). Обратите внимание на различия. Поскольку onAttach() уже получает Activity, я не использовал getActivity(). Вместо этого я использовал переданный аргумент. Для всех других методов в жизненном цикле вам придется использовать getActivity().

person A--C    schedule 09.08.2013
comment
@ user2426316 Я добавил пример. И мой, и Лоуренса Доусона должны работать. - person A--C; 10.08.2013

Когда вы создаете экземпляр своего класса Helper? Убедитесь, что это после onActivityCreated() в жизненном цикле фрагмента.

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

Следующий код должен работать:

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

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);
    }
} 
person Taormina    schedule 09.08.2013

Привет, на вопрос ответили, но обычно, если вы хотите получить контекст во фрагменте или диалоговом фрагменте, используйте это

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;
    }
}
person Erfan Eghterafi    schedule 30.03.2020