Android中点击3个独立可点击ImageView分别上传图片的实现问题
问题根因
你的原有实现存在逻辑疏漏:每次点击ImageView时仅将对应Boolean标记设为true,未重置其余两个Boolean标记为false,会出现多个标记同时为true的情况,在onActivityResult的判断逻辑中会优先命中第一个判断分支,因此无论点击哪个ImageView,最终图片都会填充到第一个控件上。
最优实现方案(推荐)
不用维护多个Boolean变量,直接通过不同的请求码(requestCode)区分不同的图片选择请求,逻辑更清晰,扩展性更强,后续新增ImageView只需新增请求码常量即可:
步骤1:定义3个不同的请求码常量
private val REQUEST_SELECT_IMAGE_1 = 1001 private val REQUEST_SELECT_IMAGE_2 = 1002 private val REQUEST_SELECT_IMAGE_3 = 1003 // 同时声明3个Uri变量存储对应选中的图片地址 private var selectedUri1: Uri? = null private var selectedUri2: Uri? = null private var selectedUri3: Uri? = null
步骤2:修改点击事件,唤起选图时传入对应请求码
// 第一个ImageView点击逻辑 upload1.setOnClickListener { selectImage(REQUEST_SELECT_IMAGE_1) } // 第二个ImageView点击逻辑 upload2.setOnClickListener { selectImage(REQUEST_SELECT_IMAGE_2) } // 第三个ImageView点击逻辑 upload3.setOnClickListener { selectImage(REQUEST_SELECT_IMAGE_3) } // 封装公共的选图唤起方法 private fun selectImage(requestCode: Int) { val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) startActivityForResult(intent, requestCode) }
步骤3:onActivityResult中根据requestCode匹配对应ImageView填充
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode != Activity.RESULT_OK || data == null || data.data == null) { return } val selectedUri = data.data when (requestCode) { REQUEST_SELECT_IMAGE_1 -> { selectedUri1 = selectedUri // 这里可以替换为你自己的图片加载逻辑,比如Glide加载避免OOM val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedUri) upload1.setImageBitmap(bitmap) } REQUEST_SELECT_IMAGE_2 -> { selectedUri2 = selectedUri val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedUri) upload2.setImageBitmap(bitmap) } REQUEST_SELECT_IMAGE_3 -> { selectedUri3 = selectedUri val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedUri) upload3.setImageBitmap(bitmap) } } // 统一更新图片列表 val imageList = listOfNotNull(selectedUri1, selectedUri2, selectedUri3) }
原有方案的修正方法(不推荐)
如果你要沿用原来的Boolean标记方案,需要在每次点击时重置所有标记:
upload1.setOnClickListener { // 重置所有标记 clickedView1 = true clickedView2 = false clickedView3 = false uploadPicture() } // 其余两个点击事件同理,每次只把当前点击的标记设为true,其余设为false
同时在onActivityResult填充完图片后,也要把所有Boolean标记重置为false,避免后续判断混乱。
额外优化建议
- 直接用
MediaStore.getBitmap加载大图容易出现OOM,推荐使用Glide、Coil等第三方图片加载库加载Uri到ImageView,无需自己处理Bitmap的内存回收。 startActivityForResult在API 29及以上版本已废弃,推荐使用官方Activity Result API实现选图唤起,核心的按请求码区分对应控件的逻辑完全兼容,不需要调整。
内容的提问来源于stack exchange,提问作者callMe_whatever
相关产品推荐
相关产品推荐

