从图库选择不同图片时所有TextView显示相同名称问题求助
问题根因
你当前的实现存在两个核心问题:
- 所有选择图片的操作共用同一个请求码
SELECT_PICTURE,onActivityResult无法区分本次返回的图片需要对应绑定到哪个文本控件 - 三个文本控件的赋值逻辑是顺序执行的独立
if判断,首次选择图片时三个文本控件都为空,因此会被批量赋值为同一个图片地址
解决步骤
1. 定义区分场景的独立请求码
在Activity类中新增三个不同的请求码,用来对应三类图片的选择场景:
private static final int SELECT_PICTURE_PANCARD = 101; private static final int SELECT_PICTURE_ADHARCARD = 102; private static final int SELECT_PICTURE_ELECTRICITY_BILL = 103;
2. 修改选择按钮的触发逻辑
三个选择图片的按钮点击时,分别传入对应的请求码启动图库:
// Pan卡选择按钮点击逻辑示例 mbinding.includeMainUploadIdcard.selectPancard.setOnClickListener(v -> { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, SELECT_PICTURE_PANCARD); }); // Aadhar卡、电费账单按钮的点击逻辑同理,分别传入对应的请求码即可
3. 重构onActivityResult逻辑
根据不同的请求码,单独给对应控件赋值,替换你原有逻辑:
public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 异常情况直接拦截 if (resultCode != RESULT_OK || data == null || data.getData() == null) { return; } Uri selectedImageUri = data.getData(); String imageName = selectedImageUri.getPath(); // 按请求码匹配对应控件赋值 switch (requestCode) { case SELECT_PICTURE_PANCARD: mbinding.includeMainUploadIdcard.filenamePancard.setText(imageName); mbinding.includeMainUploadIdcard.selectPancard.setVisibility(View.VISIBLE); break; case SELECT_PICTURE_ADHARCARD: mbinding.includeMainUploadIdcard.filenameAdharcard.setText(imageName); mbinding.includeMainUploadIdcard.selectAdhar.setVisibility(View.VISIBLE); break; case SELECT_PICTURE_ELECTRICITY_BILL: mbinding.includeMainUploadIdcard.filenameElectricityBill.setText(imageName); mbinding.includeMainUploadIdcard.selectBill.setVisibility(View.VISIBLE); break; default: break; } }
额外优化建议
你当前用selectedImageUri.getPath()拿到的是媒体库的虚拟路径,不是用户可识别的真实文件名,要获取真实显示的文件名可以参考如下逻辑:
private String getRealFileName(Uri uri) { String fileName = ""; String[] projection = {MediaStore.Images.Media.DISPLAY_NAME}; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { if (cursor.moveToFirst()) { fileName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)); } cursor.close(); } return TextUtils.isEmpty(fileName) ? uri.getPath() : fileName; }
内容的提问来源于stack exchange,提问作者Garima k
相关产品推荐
相关产品推荐

