android get activity返回null

7 浏览
0 Comments

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)。

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

0
0 Comments

问题的原因可能是您正在使用一个已从Activity中分离的旧Fragment。

所以,第一次创建Fragment时,它会附加到您的Activity上。一切都很好。然后,当您切换选项卡时,您的片段可能会与Activity分离。当您切换回它时,旧的片段可能已与Activity分离,因此getActivity()返回null。

这可能是因为您正在尝试保留对片段的引用,而不是通过FragmentManager访问它们。

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

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

编辑

也许看一下这个,以及他们如何创建添加他们的ActionBar监听器。您需要将Activity的作用域添加到其中。他们的做法是在Activity / Fragment中定义侦听器(通过实现接口),然后将其附加到选项卡上。这将给您作用域,并且可能是一种更稳定的做法。

请编辑您的问题并将其添加到底部。阅读这个真的很困难。

您从哪里调用此代码?看起来应该从您的活动中调用。如果是这样,为什么要在活动中保留对活动的引用呢?为什么不只是调用setContentView(mView),而不是mAct.setContentView(mView)?

请读一下我上面的评论。似乎您根本不应该存储对活动的引用

OnTabSelected()和onTabUnselected()是ActionBar.TabListener的方法。

实际上,我创建了一个实现ActionBar.TabListener的类。

我现在意识到了。我将从现在开始通过编辑我的答案来回复。

0
0 Comments

这个问题的出现原因是,在一个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的问题。

0