片段getActivity()——避免NPE



我有一个单独的Activity应用程序,其中包含许多fragment(大约15个)。我的MyActivity中的一些方法是所有Fragments都需要的,比如显示Dialogs。所以我在一个片段的示例调用中(它们都扩展MyFragment)是这样的:

getMyActivity().displayDialog(msg);

getMyActivity的定义如MyFragment:

MyActivity getMyActivity() {
  return (MyActivity) getActivity();
}
然而,有时getActivity()是空的,所以我得到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被销毁时显示对话框。

最好使用一些ParentFragment,例如

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 {}

并使用该活动

activity.displayDialog(msg);

如果getActivity()的返回值== null,则Fragment没有附加在父activity的FragmentManager中。

一个常见的错误是将这些片段的引用保存为父活动中的对象变量。这会导致片段中的npe。

我建议您检查一下这是否是您的情况。如果没有,则:

  1. 查看您是否正确地从FragmentManager中删除了fragment
  2. 查看您是否以正确的方式将Fragments添加到Framgnetmanager。

如果是,删除对象变量并通过FragmentManager添加Fragments,参见:http://www.survivingwithandroid.com/2013/04/android-fragment-transaction.html

希望能有所帮助

最新更新