如何实现点击单个ImageView通过Glide仅加载图片至对应视图
解决点击单个ImageView选图后所有ImageView都显示同一张图的问题
问题现象
代码无报错,但点击任意ImageView选择图片后,三个ImageView都会显示选中的图片。
问题根源
- 所有ImageView的点击事件都使用了同一个请求码
RESULT_LOAD_IMG,导致onActivityResult无法区分是哪个ImageView发起的图片选择请求。 onActivityResult中没有做请求码判断,只要返回结果成功,就会依次把图片加载到三个ImageView中,这是所有ImageView显示同一张图的直接原因。
解决方案
步骤1:定义唯一请求码
为每个ImageView分配独立的请求码,用于区分不同的图片选择请求:
private static final int RESULT_LOAD_IMG_0 = 100; private static final int RESULT_LOAD_IMG_1 = 101; private static final int RESULT_LOAD_IMG_2 = 102;
步骤2:修改点击事件,使用对应请求码
每个ImageView的点击事件使用专属请求码启动图片选择:
mImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, RESULT_LOAD_IMG_0); } }); mImg1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, RESULT_LOAD_IMG_1); } }); mImg2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, RESULT_LOAD_IMG_2); } });
步骤3:修改onActivityResult,匹配请求码加载图片
在onActivityResult中通过请求码判断发起请求的ImageView,仅给对应的ImageView加载图片:
@Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && data != null) { final Uri imageUri = data.getData(); switch (requestCode) { case RESULT_LOAD_IMG_0: Glide.with(getContext()).load(imageUri).into(mImg); break; case RESULT_LOAD_IMG_1: Glide.with(getContext()).load(imageUri).into(mImg1); break; case RESULT_LOAD_IMG_2: Glide.with(getContext()).load(imageUri).into(mImg2); break; } } }
可选优化:简化点击事件代码
可以用统一的点击监听减少重复代码:
View.OnClickListener imagePickerListener = new View.OnClickListener() { @Override public void onClick(View v) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); int requestCode; switch (v.getId()) { case R.id.mImg: // 替换为你的ImageView实际ID requestCode = RESULT_LOAD_IMG_0; break; case R.id.mImg1: requestCode = RESULT_LOAD_IMG_1; break; case R.id.mImg2: requestCode = RESULT_LOAD_IMG_2; break; default: return; } startActivityForResult(photoPickerIntent, requestCode); } }; // 给三个ImageView绑定同一个监听 mImg.setOnClickListener(imagePickerListener); mImg1.setOnClickListener(imagePickerListener); mImg2.setOnClickListener(imagePickerListener);
内容的提问来源于stack exchange,提问作者Kerub Angel
相关产品推荐
相关产品推荐

