Подтвердить что ты не робот

Android получить активность возвращает null

Я использую Action Bar для Activity. Для каждой вкладки я показываю разную компоновку. Поскольку макет слишком тяжелый. Поэтому я раздуваю каждый макет в виде. Поэтому на каждой вкладке выберите

public void onTabSelected(Tab tab, FragmentTransaction ft) {
    if (mView == null) {
        mView = LayoutInflater.from(mAct).inflate(mLayout, null);  // mAct is Activity reference
    }
    mAct.setContentView(mView);
    for (int i = 0; i < mFrags.length; i++) {
     mFrags[i] = (LutronFragment) mAct.getFragmentManager()
         .findFragmentById(mIds[i]);

     if (mFrags[i] != null) {
       mFrags[i].setupHeader();
      }
  }
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  for (Fragment f : mFrags) {
   try { 
         if (f != null) {
        ft.remove(f);
      }
  } catch (IllegalStateException e) {
        e.printStackTrace();
  }
   }
}

Итак, если я выберем вкладку второй раз и сделаю некоторую операцию на этой вкладке, приложение будет разбито на getActivity. (NullPointerException)

Просьба предложить, если есть какой-то другой подход к тяжелой компоновке кеша.

4b9b3361

Ответ 1

Вероятнее всего, вы используете старый фрагмент, который был отделен от вашей активности.

Итак, в первый раз, когда вы создаете свой фрагмент, он привязан к вашей деятельности. Все хорошо. Затем, когда вы меняете вкладку, ваш фрагмент может быть или не быть отделен от действия. Когда вы вернетесь к ней, старый фрагмент может быть отделен от действия и поэтому getActivity() возвращает значение null.

Это может произойти, если вы пытаетесь сохранить ссылки на свои фрагменты, а не обращаться к ним через FragmentManager.

Это также может произойти, если ваш адаптер возвращает ссылку на фрагмент, а не на новый фрагмент. Я попал в эту ловушку.

(Проводка кода, в котором вы создаете свои фрагменты, может помочь)

Edit

Возможно, посмотрите это и то, как они создают, добавляют своих слушателей ActionBar. Вам нужна область действия. То, как они это делают, - определить слушателя в Activity/Fragment (через реализацию интерфейса), а затем прикрепить его к Tab. Это даст вам возможность и, вероятно, более стабильный способ делать что-то.

Ответ 2

Это может произойти, если вы создаете анонимный объект внутри фрагмента, который вызывает getActiviy(). Если getActivity() вызывается в анонимном объекте после того, как фрагмент вытащил стек фрагмента, getActivity() вернет значение null. В этот момент фрагмент больше не связан с активностью.