Android开发如何加载drawable图片构建画廊实现头像选择功能
实现方案
1. 加载drawable目录下的图片资源
你可以通过资源名动态获取对应资源ID,不需要硬编码R.drawable常量,代码如下:
Kotlin 版本
val imageNames = listOf("image1", "image2", "image3") val resIdList = mutableListOf<Int>() for (name in imageNames) { // 注意:getIdentifier不需要传文件后缀.jpg val resId = resources.getIdentifier(name, "drawable", packageName) if (resId != 0) { // 返回0代表未找到对应资源,过滤异常 resIdList.add(resId) } }
Java 版本
List<String> imageNames = Arrays.asList("image1", "image2", "image3"); List<Integer> resIdList = new ArrayList<>(); for (String name : imageNames) { int resId = getResources().getIdentifier(name, "drawable", getPackageName()); if (resId != 0) { resIdList.add(resId); } }
注意:不要给资源名加
.jpg后缀,Android资源索引会自动忽略文件后缀,传带后缀的名称会找不到资源。
2. 构建画廊视图
推荐用RecyclerView实现网格样式的画廊,性能更优:
2.1 画廊Activity布局(activity_gallery.xml)
<?xml version="1.0" encoding="utf-8"?> <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/galleryRv" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp"/>
2.2 画廊子项布局(item_gallery_image.xml)
<?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/imageIv" android:layout_width="match_parent" android:layout_height="120dp" android:scaleType="centerCrop" android:layout_margin="4dp"/>
2.3 画廊适配器实现
class GalleryAdapter( private val imageResList: List<Int>, private val onItemClick: (resId: Int) -> Unit ) : RecyclerView.Adapter<GalleryAdapter.ImageViewHolder>() { inner class ImageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val imageIv: ImageView = itemView.findViewById(R.id.imageIv) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_gallery_image, parent, false) return ImageViewHolder(view) } override fun onBindViewHolder(holder: ImageViewHolder, position: Int) { val resId = imageResList[position] holder.imageIv.setImageResource(resId) holder.itemView.setOnClickListener { onItemClick(resId) } } override fun getItemCount() = imageResList.size }
3. 画廊Activity逻辑处理
点击图片后将选中的资源ID返回给第一个Activity:
class GalleryActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_gallery) // 加载图片资源列表 val imageNames = listOf("image1", "image2", "image3") val resIdList = mutableListOf<Int>() for (name in imageNames) { val resId = resources.getIdentifier(name, "drawable", packageName) if (resId != 0) resIdList.add(resId) } // 初始化RecyclerView为3列网格布局 val galleryRv = findViewById<RecyclerView>(R.id.galleryRv) galleryRv.layoutManager = GridLayoutManager(this, 3) galleryRv.adapter = GalleryAdapter(resIdList) { selectedResId -> // 返回选中结果给上一级页面 val resultIntent = Intent() resultIntent.putExtra("selected_avatar_res", selectedResId) setResult(RESULT_OK, resultIntent) finish() } } }
4. 第一个Activity接收选中结果设置头像
// 先在第一个Activity中注册启动画廊的回调 private val galleryLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val resId = result.data?.getIntExtra("selected_avatar_res", 0) ?: 0 if (resId != 0) { // 设置选中的图片为头像 findViewById<ImageView>(R.id.avatarIv).setImageResource(resId) } } } // 点击默认头像时跳转画廊 findViewById<ImageView>(R.id.avatarIv).setOnClickListener { val intent = Intent(this, GalleryActivity::class.java) galleryLauncher.launch(intent) }
小提示:如果drawable下的图片分辨率过高,建议先做压缩处理再加载,避免出现内存溢出问题。
内容的提问来源于stack exchange,提问作者user15621727
相关产品推荐
相关产品推荐

