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)
Просьба предложить, если есть какой-то другой подход к тяжелой компоновке кеша.
Ответы
Ответ 1
Вероятнее всего, вы используете старый фрагмент, который был отделен от вашей активности.
Итак, в первый раз, когда вы создаете свой фрагмент, он привязан к вашей деятельности. Все хорошо. Затем, когда вы меняете вкладку, ваш фрагмент может быть или не быть отделен от действия. Когда вы вернетесь к ней, старый фрагмент может быть отделен от действия и поэтому getActivity()
возвращает значение null.
Это может произойти, если вы пытаетесь сохранить ссылки на свои фрагменты, а не обращаться к ним через FragmentManager
.
Это также может произойти, если ваш адаптер возвращает ссылку на фрагмент, а не на новый фрагмент. Я попал в эту ловушку.
(Проводка кода, в котором вы создаете свои фрагменты, может помочь)
Edit
Возможно, посмотрите это и то, как они создают, добавляют своих слушателей ActionBar. Вам нужна область действия. То, как они это делают, - определить слушателя в Activity/Fragment (через реализацию интерфейса), а затем прикрепить его к Tab. Это даст вам возможность и, вероятно, более стабильный способ делать что-то.
Ответ 2
Это может произойти, если вы создаете анонимный объект внутри фрагмента, который вызывает getActiviy()
. Если getActivity()
вызывается в анонимном объекте после того, как фрагмент вытащил стек фрагмента, getActivity()
вернет значение null. В этот момент фрагмент больше не связан с активностью.