android get activity返回null

我在一个Activity上使用Action Bar。 对于每个标签我显示不同的布局。 由于布局太重。 所以我将每个布局充满一个视图。 所以在每个选项卡上select

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(); } } } 

所以,现在,如果我第二次select选项卡,并在该选项卡上执行一些操作,应用程序会崩溃getActivity。(NullPointerException)

请build议是否有其他的方法来caching繁重的布局。

问题很可能是您正在使用从您的活动中分离出来的旧片段。

所以,第一次创build你的片段,它是附加到你的活动。 一切都很好。 然后,当你改变标签,你的片段可能会或可能不会从活动分离。 当你回顾它时,旧的片段可能会从活动中分离,所以getActivity()返回null。

如果您试图保留对碎片的引用,而不是通过FragmentManager访问碎片,就会发生这种情况。

如果您的适配器正在返回对片段的引用而不是新片段,也会发生这种情况。 我陷入了这个陷阱。

(发布代码的地方可能会有所帮助)

编辑

也许看看这个以及他们如何创build添加他们的ActionBar监听器。 你需要范围到你的活动。 他们这样做的方式是在Activity / Fragment中定义监听器(通过实现一个接口),然后将其附加到Tab中。 这将给你的范围,可能是一个更稳定的做事方式。

如果您在调用getActiviy()的片段内创build匿名对象,就会发生这种情况。 如果在片段堆栈popup片段后,匿名对象中调用getActivity() ,则getActivity()将返回null。 此时,片段不再与活动相关联。