GeneralDialogFragment获取参数时触发空指针异常求助
问题分析与解决方案
嘿,我一眼就发现导致空指针异常的两个关键问题啦,咱们逐一解决:
1. 调用方式错误(核心原因)
你在Activity里的代码犯了一个典型的静态工厂方法使用错误:
GeneralDialogFragment generalDialogFragment = new GeneralDialogFragment();
generalDialogFragment.newInstance("Test", "Its working good");
generalDialogFragment.show(getFragmentManager(), "dialog");
newInstance()是静态方法,它内部会创建一个新的GeneralDialogFragment实例并给它设置Arguments,但你并没有把这个返回的实例赋值给变量,反而用自己手动new出来的那个实例去调用show()——这个手动new的实例根本没有设置过Arguments,所以在onCreateDialog()里调用getArguments()时自然会返回null,触发空指针异常。
正确的调用方式
直接通过静态工厂方法获取实例,不要手动new:
GeneralDialogFragment generalDialogFragment = GeneralDialogFragment.newInstance("Test", "Its working good"); generalDialogFragment.show(getFragmentManager(), "dialog");
2. Bundle的Key不匹配(隐藏坑)
除了调用问题,你还在newInstance()里留了个小陷阱:
args.putString("title ", title); // 注意key末尾有个空格!
而在onCreateDialog()里取title时用的key是"title"(没有空格):
.setTitle(getArguments().getString("title"))
就算你修复了调用问题,这里也会取不到title的值(返回null),导致对话框标题为空。所以要把key统一,去掉空格:
// newInstance里修正key args.putString("title", title);
修正后的完整代码
GeneralDialogFragment类(关键部分修正)
public static GeneralDialogFragment newInstance(String title, String message) { GeneralDialogFragment dialog = new GeneralDialogFragment(); Bundle args = new Bundle(); args.putString("title", title); // 去掉key末尾的空格 args.putString("message", message); dialog.setArguments(args); return dialog; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // 增加判空,让代码更健壮 Bundle args = getArguments(); String title = args != null ? args.getString("title") : ""; String message = args != null ? args.getString("message") : ""; return new AlertDialog.Builder(getActivity()) .setTitle(title) .setMessage(message) .setCancelable(false) .create(); }
Activity调用代码
GeneralDialogFragment generalDialogFragment = GeneralDialogFragment.newInstance("Test", "Its working good"); generalDialogFragment.show(getFragmentManager(), "dialog");
这样修改后,空指针异常就会消失,对话框也能正常显示标题和内容啦!
内容的提问来源于stack exchange,提问作者Sudeep
相关产品推荐
相关产品推荐

