我有一个单独的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。我建议您检查一下这是否是您的情况。如果没有,则:
- 查看您是否正确地从FragmentManager中删除了fragment
- 查看您是否以正确的方式将Fragments添加到Framgnetmanager。
如果是,删除对象变量并通过FragmentManager添加Fragments,参见:http://www.survivingwithandroid.com/2013/04/android-fragment-transaction.html
希望能有所帮助