Android开发问题:如何将裁剪后图片URI对应到点击的ImageView
解决多个ImageView裁剪后图片混淆的问题
你遇到的问题非常典型——现在不管点击哪个按钮启动裁剪,onActivityResult里都会把裁剪后的Uri同时赋值给三个图片变量,然后给所有ImageView设置图片,自然会出现全部同步更新的情况。下面给你两种简单可行的解决方案:
方案一:用标记变量记录当前操作的ImageView
这个方法逻辑直观,通过一个变量标记当前点击的是第几个图片,返回结果时根据标记更新对应控件:
- 首先在你的
EditProfileActivity类里添加一个标记变量:
private int currentTargetImage = -1; // 默认值-1表示没有选中任何图片
- 修改每个按钮的点击事件,设置对应的标记:
profileImageEdit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { currentTargetImage = 1; // 标记要修改第一个ImageView CropImage.activity() .setAspectRatio(1, 1) .start(EditProfileActivity.this); } }); profileImageEdit2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { currentTargetImage = 2; // 标记要修改第二个ImageView CropImage.activity() .setAspectRatio(1, 1) .start(EditProfileActivity.this); } }); profileImageEdit3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { currentTargetImage = 3; // 标记要修改第三个ImageView CropImage.activity() .setAspectRatio(1, 1) .start(EditProfileActivity.this); } });
- 改写
onActivityResult方法,根据标记更新对应的ImageView:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { CropImage.ActivityResult result = CropImage.getActivityResult(data); Uri croppedUri = result.getUri(); // 根据标记更新对应ImageView switch(currentTargetImage) { case 1: imageUri1 = croppedUri; ImageUploaded1.setImageURI(imageUri1); break; case 2: imageUri2 = croppedUri; ImageUploaded2.setImageURI(imageUri2); break; case 3: imageUri3 = croppedUri; ImageUploaded3.setImageURI(imageUri3); break; default: // 无有效标记时的默认处理,可忽略 break; } // 重置标记,避免后续误触发 currentTargetImage = -1; } else { startActivity(new Intent(EditProfileActivity.this, ProfileActivity.class)); finish(); } }
方案二:给每个裁剪请求设置不同的RequestCode
CropImage支持自定义请求码,你可以给每个按钮的裁剪请求分配唯一的requestCode,然后在onActivityResult里根据请求码判断要更新哪个ImageView:
- 修改按钮点击事件,设置自定义requestCode:
profileImageEdit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CropImage.activity() .setAspectRatio(1, 1) .start(EditProfileActivity.this, 100); // 自定义请求码100 } }); profileImageEdit2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CropImage.activity() .setAspectRatio(1, 1) .start(EditProfileActivity.this, 101); // 自定义请求码101 } }); profileImageEdit3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CropImage.activity() .setAspectRatio(1, 1) .start(EditProfileActivity.this, 102); // 自定义请求码102 } });
- 改写
onActivityResult方法:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { CropImage.ActivityResult result = CropImage.getActivityResult(data); Uri croppedUri = result.getUri(); // 根据请求码判断要更新的ImageView if (requestCode == 100) { imageUri1 = croppedUri; ImageUploaded1.setImageURI(imageUri1); } else if (requestCode == 101) { imageUri2 = croppedUri; ImageUploaded2.setImageURI(imageUri2); } else if (requestCode == 102) { imageUri3 = croppedUri; ImageUploaded3.setImageURI(imageUri3); } } else { startActivity(new Intent(EditProfileActivity.this, ProfileActivity.class)); finish(); } }
两种方案都能解决你的问题,选你觉得更顺手的就行。测试的时候记得点击不同按钮,确认每个ImageView只会更新对应裁剪后的图片~
内容的提问来源于stack exchange,提问作者Egy Ramschie
相关产品推荐
相关产品推荐

