Android从图库选图替换头像后仍显示原有图片问题如何解决
问题根因
- GalleryActivity中的
imageView控件未做任何初始化:你既没有在onCreate中调用setContentView()绑定布局,也没有通过findViewById给imageView赋值,该变量本身就是空引用,赋值操作不会生效。 - 两个Activity之间没有数据回传逻辑:GalleryActivity选完图片后没有将选中的Uri回传给ProfileActivity,ProfileActivity拿不到新的图片地址,自然只能显示原有头像。
- 逻辑完全错位:你在GalleryActivity中给当前页面的
imageView设图,就算设置成功,影响的也是GalleryActivity的控件,和ProfileActivity中的头像控件没有任何关系。
解决方案
提供两种可落地的修改方案:
方案1:删除冗余的GalleryActivity,直接在ProfileActivity处理选图逻辑(更简洁,推荐)
修改ProfileActivity代码:
- 先把头像控件定义为成员变量,新增选图请求码:
public class ProfileActivity extends AppCompatActivity { private ImageView exampleImage; private static final int PICK_IMAGE = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); // 初始化头像控件 exampleImage = findViewById(R.id.exampleImageView); exampleImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 直接跳转系统图库选图,不需要中间页 Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); startActivityForResult(gallery, PICK_IMAGE); } }); } // 接收选图结果,直接给头像设值 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) { Uri imageUri = data.getData(); exampleImage.setImageURI(imageUri); } } }
- 直接删除无用的GalleryActivity即可。
方案2:保留GalleryActivity,通过Intent回传图片Uri
如果业务需要保留GalleryActivity做额外处理,按如下修改:
第一步:修改GalleryActivity代码,选图后回传数据
public class GalleryActivity extends AppCompatActivity { private static final int PICK_IMAGE = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 不需要绑定布局,直接调系统图库 Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); startActivityForResult(gallery, PICK_IMAGE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) { Uri imageUri = data.getData(); // 把选中的Uri塞到返回数据里 Intent resultIntent = new Intent(); resultIntent.putExtra("selected_image_uri", imageUri); setResult(RESULT_OK, resultIntent); } else { // 用户取消选图的情况 setResult(RESULT_CANCELED); } finish(); } }
第二步:修改ProfileActivity代码,接收回传的Uri
public class ProfileActivity extends AppCompatActivity { private ImageView exampleImage; private static final int REQUEST_GALLERY = 200; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); exampleImage = findViewById(R.id.exampleImageView); exampleImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 带返回结果的跳转 startActivityForResult(new Intent(ProfileActivity.this, GalleryActivity.class), REQUEST_GALLERY); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == REQUEST_GALLERY) { Uri selectedUri = data.getParcelableExtra("selected_image_uri"); if (selectedUri != null) { exampleImage.setImageURI(selectedUri); } } } }
注意事项
- 安卓6.0及以上版本需要动态申请
READ_EXTERNAL_STORAGE权限,否则无法正常获取图库图片。 - 若选中的图片分辨率过高,直接调用
setImageURI可能触发内存溢出,建议引入Glide、Picasso等第三方图片加载框架加载Uri,自动完成压缩和缓存处理。 - 安卓10及以上版本采用分区存储机制,通过
ACTION_PICK获取图库Uri不需要申请存储权限,无需额外适配。
内容的提问来源于stack exchange,提问作者chen abien
相关产品推荐
相关产品推荐

