14

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

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

4

2 回答 2

39

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

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

如果您尝试保留对片段的引用,而不是通过FragmentManager.

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

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

编辑

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

于 2012-07-18T07:29:05.197 回答
6

如果您在调用getActiviy(). 如果getActivity()在片段从片段堆栈中弹出后在匿名对象中调用,getActivity()将返回 null。此时,片段不再与活动相关联。

于 2014-07-23T20:18:42.963 回答