android get activity返回null

Ash*_*bey 13 android android-layout

我在Activity上使用Action Bar.对于每个标签,我显示不同的布局.由于布局太重.所以我将每个布局充气到视图中.所以在每个Tab上选择

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();
  }
   }
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我第二次选择tab并在该选项卡上执行某些操作,app会在getActivity上崩溃.(NullPointerException)

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

Mik*_*e T 38

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

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

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

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

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

编辑

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


小智 6

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