Android 如果在片段内实例化的AlertDialog的按钮侦听器中调用,getActivity()是否可以为null?
如果单击AlertDialog的OK按钮,我需要完成一些活动。活动只是另一个片段的容器;AlertDialog构建在片段内部。大概是这样的:Android 如果在片段内实例化的AlertDialog的按钮侦听器中调用,getActivity()是否可以为null?,android,nullpointerexception,android-alertdialog,Android,Nullpointerexception,Android Alertdialog,如果单击AlertDialog的OK按钮,我需要完成一些活动。活动只是另一个片段的容器;AlertDialog构建在片段内部。大概是这样的: public class F extends Fragment { ... public void confirmExit() { new AlertDialog.Builder(getContext()) ... .setPositiveButton("OK", (dialog
public class F extends Fragment {
...
public void confirmExit() {
new AlertDialog.Builder(getContext())
...
.setPositiveButton("OK", (dialogInterface, i) -> getActivity().finish())
...
.show();
}
...
}
现在,AndroidStudio向我显示以下警告:
方法调用“finish”可能会生成“java.lang.NullPointerException”
因此它认为getActivity可能返回null。但这有可能吗?如果对话框在屏幕上且可交互,则基础活动是否可以为空?如果没有,如何在不添加样板代码的情况下抑制此警告?是。
它可能会崩溃,因为您在接口上而不是在片段上调用getActivity
您需要在DialogInterface外部存储活动的实例,并且您将能够在DialogInterface上传递该实例
应该是这样的
public class F extends Fragment {
private Context mContext;
...
@Override
void onAttach(Context context) {
mContext = context
}
public void confirmExit() {
new AlertDialog.Builder(getContext())
...
.setPositiveButton("OK", (dialogInterface, i) -> ((YourParentActivity) mContext).finish())
...
.show();
}
...
}
在上面问题中的代码中,侦听器最终成为一个匿名的内部类,该类具有对其外部类的引用。那么,您认为哪个对象拥有getActivity方法?不,它不会崩溃!实际上它现在正在工作。这个问题是关于一种可能的情况,它可能会使应用程序崩溃,但不会或不会崩溃。