片段getActivity() - 避免NPE

时间:2015-05-29 15:10:48

标签: android android-fragments nullpointerexception

我有一个活动应用程序,其中包含许多碎片(大约15个)。我的MyActivity中的某些方法是所有片段都需要的,例如显示Dialogs。所以我在Fragment的一个示例调用中(以及它们都扩展为MyFragment)的内容类似于:

getMyActivity().displayDialog(msg);

getMyActivity定义为MyFragment

MyActivity getMyActivity() {
  return (MyActivity) getActivity();
}

然而,有时候getActivity()是null,所以在那种情况下我会得到NPE。所以我正在做的是将这些方法移动到MyFragment中:

protected void displayDialog(String msg) {
  if (getMyActivity() != null) {
     getMyActivity().displayDialog(msg);
  } else {
     // what do I do here?
  }
}

这种方法对于我需要从MyActivity引用的10个左右方法是否有意义(这样做有什么陷阱)吗?另外,在getActivity()为空的情况下,我该怎么做才能提供反馈?

编辑:NullPointerException原因的一个常见示例类似于Fragment调度的网络调用以及所述网络调用完成时,尝试在Activity被破坏时显示对话框与此同时。

2 个答案:

答案 0 :(得分:0)

最好使用一些ParentFragment例如

User

然后你必须加强所有你的片段

public abstract class ParentFragment extends Fragment {

public Activity activity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.activity = activity;
}

}

并使用

的活动
public class SomeFragment extends ParentFragment {}

答案 1 :(得分:0)

如果getActivity()的返回值== null,则片段未附加到父活动的FragmentManager中。

常见的错误是将这些片段的引用作为父活动中的对象变量。这导致了碎片中的NPE。

我建议你检查一下你的情况。 如果没有,那么:

  1. 查看您是否正确删除FragmentManager中的碎片
  2. 看看你是否正确地将碎片添加到Framgnetmanager。
  3. 如果是,删除对象变量并通过FragmentManager添加片段,请参阅:http://www.survivingwithandroid.com/2013/04/android-fragment-transaction.html

    希望这有帮助