安卓获取活动返回空值

14

我正在Activity上使用ActionBar。对于每个选项卡,我都显示不同的布局。由于布局太重了,所以我将每个布局都填充到一个视图中。因此,在每个选项卡选择时

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)

请建议是否有其他方法可以缓存重型布局。


你是说 mAct 变成了 null 吗? 此外,缓存布局没有意义,你应该在后台加载布局,而前台应该有一些用户界面,比如进度对话框或某种中间用户可交互的屏幕。 最后,请考虑减少布局的权重,或按需加载元素。你能发布你的布局 xml 文件来查看它是否真的很重吗? - gaara87
2个回答

39
问题很可能是您正在使用已从Activity中分离的旧Fragment。
因此,第一次创建Fragment时,它会附加到Activity上,一切正常。然后当您更改选项卡时,您的Fragment可能会与Activity分离或未分离。当您切换回来时,旧Fragment可能已经与Activity分离,因此getActivity()返回null。
如果您尝试保留对Fragment的引用而不是通过FragmentManager访问它们,则可能会发生这种情况。
如果您的适配器返回对Fragment的引用而不是新Fragment,则也可能会发生这种情况。我曾陷入过这个陷阱。
(发布创建Fragment代码的代码可能会有所帮助)
编辑
也许看一下这个,以及他们如何添加其ActionBar监听器。您需要访问您的Activity。他们这样做的方式是在Activity / Fragment中定义侦听器(通过实现接口),然后将其附加到选项卡上。这将为您提供范围,并且可能是更稳定的方法。

请编辑您的问题并将其添加到底部。尝试阅读这个真的很困难。 - Mike T
你在哪里调用这段代码?看起来应该是从你的活动中调用的。如果是这样,为什么要在你的活动中保留对活动的引用呢?为什么不只调用“setContentView(mView)”而不是“mAct.setContentView(mView)”? - Mike T
请阅读我上面的评论。似乎你根本不应该存储对你的活动的引用。 - Mike T
OnTabSelected()和onTabUnselected()是ActionBar.TabListener的方法。 - Ashutosh Dubey
实际上,我已经创建了一个实现ActionBar.TabListener接口的类。 - Ashutosh Dubey
我现在意识到了。从现在开始,我会通过编辑我的答案来回复。 - Mike T

6

如果在片段中创建一个匿名对象并调用getActiviy(),就可能发生这种情况。如果在弹出片段堆栈后,在匿名对象中调用getActivity()getActivity()将返回null。此时,该片段不再与活动相关联。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接