为什么集成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
相关产品推荐
相关产品推荐

