android get activity返回null
android get activity返回null
我正在一个Activity上使用Action Bar。对于每个Tab,我都在显示不同的布局。由于布局过于繁重,所以我将每个布局都填充到一个视图中。因此,在每个Tab被选择时,
public void onTabSelected(Tab tab, FragmentTransaction ft) { if (mView == null) { mView = LayoutInflater.from(mAct).inflate(mLayout, null); // mAct是Activity的引用 } 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(); } } }
现在,如果我再次选择tab并对该tab进行一些操作,应用程序会在getActivity出现崩溃(NullPointerException)。
请建议是否有其他方法来缓存繁重的布局。
问题的原因可能是您正在使用一个已从Activity中分离的旧Fragment。
所以,第一次创建Fragment时,它会附加到您的Activity上。一切都很好。然后,当您切换选项卡时,您的片段可能会与Activity分离。当您切换回它时,旧的片段可能已与Activity分离,因此getActivity()返回null。
这可能是因为您正在尝试保留对片段的引用,而不是通过FragmentManager访问它们。
如果您的适配器返回对片段的引用而不是新的片段,也可能会发生这种情况。我曾经陷入这个陷阱。
(发布创建片段的代码可能会有所帮助)
编辑
也许看一下这个,以及他们如何创建添加他们的ActionBar监听器。您需要将Activity的作用域添加到其中。他们的做法是在Activity / Fragment中定义侦听器(通过实现接口),然后将其附加到选项卡上。这将给您作用域,并且可能是一种更稳定的做法。
请编辑您的问题并将其添加到底部。阅读这个真的很困难。
您从哪里调用此代码?看起来应该从您的活动中调用。如果是这样,为什么要在活动中保留对活动的引用呢?为什么不只是调用setContentView(mView),而不是mAct.setContentView(mView)?
请读一下我上面的评论。似乎您根本不应该存储对活动的引用
OnTabSelected()和onTabUnselected()是ActionBar.TabListener的方法。
实际上,我创建了一个实现ActionBar.TabListener的类。
我现在意识到了。我将从现在开始通过编辑我的答案来回复。
这个问题的出现原因是,在一个Fragment中创建了一个匿名对象,并在该匿名对象中调用了getActivity()
方法。如果在Fragment被弹出Fragment堆栈之后,在匿名对象中调用了getActivity()
方法,那么getActivity()
方法会返回null。此时,该Fragment已不再与任何活动相关联。
为了解决这个问题,可以在Fragment中使用一个成员变量来保存Activity对象的引用。在Fragment的onAttach()
方法中,将Activity对象赋给该成员变量。然后,在匿名对象中使用该成员变量来代替getActivity()
方法的调用。
以下是示例代码:
public class MyFragment extends Fragment { private Activity mActivity; @Override public void onAttach(@NonNull Context context) { super.onAttach(context); mActivity = (Activity) context; } // 在匿名对象中使用mActivity代替getActivity() }
通过使用这种方法,可以避免在匿名对象中调用getActivity()
方法返回null的问题。