You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:39