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

为什么集成AlertDialog实现头像选择时Android应用会崩溃?

崩溃根因

你遇到的崩溃为空指针异常,问题出在chooseProfilePic方法的控件查找逻辑:

你调用的findViewById()默认会从Activity当前加载的R.layout.activity_sign_up布局中检索控件,但gallery_pick、camera_pick两个按钮属于自定义Dialog的R.layout.alert_dialog布局,不存在于Activity布局中,所以查找返回null,后续给空对象设置点击事件就会触发崩溃。

修复方案

仅需要修改chooseProfilePic方法中两行控件查找代码,从你inflate出来的Dialog布局对象dialogView中查找对应控件即可:

private void chooseProfilePic()
{
    AlertDialog.Builder builder = new AlertDialog.Builder(SignUpActivity.this);
    LayoutInflater inflater = getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.alert_dialog,null);
    builder.setCancelable(false);
    builder.setView(dialogView);

    // 改为从dialogView中查找控件
    galleryPick = dialogView.findViewById(R.id.gallery_pick);
    cameraPick = dialogView.findViewById(R.id.camera_pick);

    AlertDialog alertDialog = builder.create();
    alertDialog.show();

    cameraPick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if(cameraIntent.resolveActivity(getPackageManager()) != null)
            {
                activityResultLauncher.launch(cameraIntent);
            }
        }
    });
    // 可在此补充galleryPick的点击事件实现相册选图逻辑
}

额外注意事项

  • Android 6.0及以上系统需要提前申请CAMERA动态权限,否则调用拍照功能会触发崩溃
  • 当前代码仅获取拍照返回的缩略图,清晰度较低,若需要高清头像,需要自行配置拍照输出的Uri路径,不直接读取Intent返回的data数据
  • 当前代码未实现相册选图逻辑,可参照拍照逻辑补充相册跳转和结果处理代码

内容的提问来源于stack exchange,提问作者Terminator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:45:05