Android getActivity() всегда возвращает null внутри фрагмента

У меня возникла странная проблема, с которой я столкнулся: метод getActivity() всегда возвращает нуль внутри фрагмента. Я вызываю его после завершения работы onAttach() и onCreateView().

Этот фрагмент находится внутри FragmentActivity(), который содержит стек фрагментов, и я добавляю к нему фрагмент следующим образом:

(Этот код вызывается из onCreate() действия Fragment())

SmartFragment fragment;
fragment = (SmartFragment) Fragment.instantiate(this,
fragmentClassName, params);     
mStackOfFragments.add(fragment);
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.add(R.id.tabcontent, fragment);
trans.addToBackStack(null);
trans.commitAllowingStateLoss();

Я надеюсь, что это достаточно ясно

Редактировать 1:

Вызов getActivity():

protected OnDoneListener nDoneListener = new OnDoneListener() {

    @Override
    public void OnDone(final int counter, final String name) {


        if (getActivity() != null)
            ((TabActivity) getActivity()).RunOnUiThread(new Runnable() {

... ...

Этот обратный вызов вызывается из другого класса.

Редактировать 2:

class MemoryManager()
{

    private OnDoneListener nDoneListener;

    public void setOnDoneListener(OnDoneListener onDoneListener)
    {
    this.onDoneListner = onDoneListener;
    }

    public void updateUiOnRequestFinish()
    {
      onDoneListener.onDone();
    }

}

Сам MemoryManaget вызывает updateUiOnRequestFinish() из другого обратного вызова.

Редактировать 3:

Журналы FragmentManager:

04-08 18:44:05.950: V/FragmentManager(16280): Commit: BackStackEntry{41f9bd60}
`04-08 18:44:05.950: D/FragmentManager(16280):   mName=null mIndex=-1 mCommitted=false
04-08 18:44:05.950: D/FragmentManager(16280):   Operations:
04-08 18:44:05.950: D/FragmentManager(16280):     Op #0: ADD FragmentMyProfile{41f9bc20 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): Setting back stack index 0 to BackStackEntry{41f9bd60}
04-08 18:44:05.950: V/FragmentManager(16280): Run: BackStackEntry{41f9bd60 #0}
04-08 18:44:05.950: V/FragmentManager(16280): Bump nesting in BackStackEntry{41f9bd60 #0} by 1
04-08 18:44:05.950: V/FragmentManager(16280): Bump nesting of FragmentMyProfile{41f9bc20 id=0x7f070126} to 1
04-08 18:44:05.950: V/FragmentManager(16280): add: FragmentMyProfile{41f9bc20 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): Allocated fragment index FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): moveto CREATED: FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:05.950: V/FragmentManager(16280): moveto ACTIVITY_CREATED: FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:05.990: V/FragmentManager(16280): moveto STARTED: FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
04-08 18:44:06.030: V/FragmentManager(16280): moveto RESUMED: FragmentMyProfile{41f9bc20 #0 id=0x7f070126}
`

И это выглядит хорошо для меня. Итак, я предполагаю, что эта ошибка связана с тем, как я вызываю getActivity() из обратного вызова.


person Nativ    schedule 08.04.2013    source источник
comment
это только странно, если вы не знакомы с жизненным циклом фрагмента... developer.android. com/guide/components/ ... также проверьте несколько строк перед этим абзацем ... вы добавляете фрагмент в действие в конструкторе действий?   -  person Selvin    schedule 08.04.2013
comment
Можете ли вы поместить код в строку getActivity()?   -  person Arnaldo Ignacio Gaspar Véjar    schedule 08.04.2013
comment
Селвин: Из вашего комментария следует, что это тривиальная проблема, ну, я надеюсь, что вы правы, но, вероятно, это не так. Я знаю эту ссылку и ее содержимое, и у меня все еще есть эта проблема   -  person Nativ    schedule 08.04.2013
comment
Вы действительно прочитали страницу, на которую ссылается Селвин? Внимание: если вам нужен объект Context внутри фрагмента, вы можете вызвать getActivity(). Однако будьте осторожны и вызывайте getActivity() только тогда, когда фрагмент присоединен к действию. ... Я не уверен, что вы имеете в виду под onAttach и onCreateView, но фрагмент не прикрепляется во время этих методов. Попробуйте вызвать getActivity из onActivityCreated или позже. Кроме того, да, напишите, откуда вы на самом деле вызываете getActivity.   -  person Charlie Collins    schedule 08.04.2013
comment
Хорошо, см. редактирование 2, фрагмент должен быть прикреплен к активности после вызова onAttach() onCreateView() и onResume() (фрагмент активен в соответствии со схемой в ссылке).   -  person Nativ    schedule 08.04.2013
comment
В подобных случаях спасает FragmentManager.enableDebugLogging(true). Ищите все, что может перемещать ваш фрагмент в состояние STOPPED и далее. Ваш фрагмент наверняка не прикреплен, иначе getActivity() даст вам ссылку.   -  person Delyan    schedule 08.04.2013


Ответы (1)


Эта проблема может быть связана с использованием getActivity() из "android.app.Fragment" или "android.support.v4.app.Fragment"

если вы используете «android.support.v4.app.Fragment», вам необходимо проверить, не используете ли вы getActivity из «android.app.Fragment» или наоборот.

person Maria Mercedes Wyss Alvarez    schedule 09.04.2013
comment
это решило мою проблему. я использую getSupportActivity() вместо getActivity(), так как использую Holo Everywhere. До сих пор не совсем понимаю, почему getActivity() работал при первой загрузке фрагмента, но не тогда, когда я уходил, а затем возвращался... - person speedynomads; 04.06.2013