【问题标题】:android get activity returns nullandroid 获取活动返回 null
【发布时间】:2012-07-18 07:19:37
【问题描述】:

我在 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) 上崩溃

如果有其他缓存重布局的方法,请提出建议。

【问题讨论】:

  • 您是说mAct 变为空吗?此外,缓存布局没有意义,您应该做的是在后台加载布局,而前台应该有一些用户界面,如进度对话框或某种中间用户可交互屏幕。最后,考虑减少布局的重量,或按需加载元素。您可以发布您的布局 xml 以查看它是否真的很重?

标签: android android-layout


【解决方案1】:

问题很可能是您使用的旧 Fragment 已从您的 Activity 中分离出来。

因此,第一次创建 Fragment 时,它会附加到您的活动中。一切都很好。然后,当您更改选项卡时,您的片段可能会或可能不会与活动分离。当您返回它时,旧片段可能会从活动中分离出来,因此getActivity() 返回 null。

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

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

(发布您创建片段的代码可能会有所帮助)

编辑

也许看看this 以及他们如何创建添加他们的 ActionBar 侦听器。您需要活动范围。他们这样做的方式是在 Activity/Fragment 中定义侦听器(通过实现接口),然后将其附加到 Tab。这将为您提供范围,并且可能是一种更稳定的做事方式。

【讨论】:

  • 请编辑您的问题并将其添加到底部。读这个真的很难。
  • 您从哪里调用此代码?看起来它会从您的活动中调用。如果是这样,为什么要在您的活动中保留对您的活动的引用?为什么不直接打电话给setContentView(mView) 而不是mAct.setContentView(mView)
  • 请阅读我上面的评论。您似乎根本不应该存储对您的活动的引用
  • OnTabSelected() 和 onTabUnselected() 是 ActionBar.TabListener 的方法。
  • 其实我已经创建了一个实现ActionBar.TabListener的类。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2011-10-22
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多