在AlertDialog中创建ListView时触发NullPointerException求助
解决AlertDialog中ListView的NullPointerException问题
嘿,这个空指针问题其实一眼就能看出来——你在代码里找错了ListView的ID!
看你的XML布局,ListView的ID明明是@+id/listView,但你在Java代码里写的是:
ListView listView = (ListView) mView.findViewById(R.id.textView);
用R.id.textView去查找ListView,肯定会返回null啊,这时候调用setAdapter可不就抛出空指针异常了嘛。
除了这个核心问题,你的AlertDialog创建顺序也有点小问题:应该先调用builder.setView(mView)再创建dialog,不然你设置的布局不会生效。
我给你修复后的完整代码,还加了一些防崩溃的处理:
@Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); PackageManager pm = getPackageManager(); ApplicationInfo app = applist.get(position); ArrayAdapter<String> arrayAdapter = null; try{ AlertDialog.Builder builder = new AlertDialog.Builder(ViewAppsPermissions.this); final View mView = getLayoutInflater().inflate(R.layout.popup_layout,null); // 先设置弹窗布局,再创建dialog实例 builder.setView(mView); AlertDialog dialog = builder.create(); Button button = (Button) mView.findViewById(R.id.button7); // 修复:使用正确的ListView ID ListView listView = (ListView) mView.findViewById(R.id.listView); try { PackageInfo packageInfo = pm.getPackageInfo(app.packageName, PackageManager.GET_PERMISSIONS); String[] requestedPermissions = packageInfo.requestedPermissions; System.out.println("length :" + (requestedPermissions != null ? requestedPermissions.length : 0)); // 处理权限数组为空的情况,避免后续崩溃 if(requestedPermissions != null){ arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, requestedPermissions); } else { arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new String[]{"No permissions requested"}); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); // 获取权限失败时显示提示文本 arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new String[]{"Failed to retrieve permissions"}); } // 最后再做一次非空判断,双重保险 if(listView != null){ listView.setAdapter(arrayAdapter); } dialog.show(); // 给关闭按钮添加点击事件,让弹窗可以正常关闭 button.setOnClickListener(v1 -> dialog.dismiss()); } catch(ActivityNotFoundException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } }
额外说明几点:
- 加了
requestedPermissions的非空判断:有些应用可能没有声明任何权限,这时候packageInfo.requestedPermissions会返回null,提前处理可以避免潜在的崩溃。 - 给Close按钮补充了关闭对话框的逻辑,让弹窗的功能更完整。
- 对ListView做了最后一次非空判断,双重保险防止意外空指针。
内容的提问来源于stack exchange,提问作者federicosancho
相关产品推荐
相关产品推荐

