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

从图库选择不同图片时所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:36:04