You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现网格样式的画廊,性能更优:

<?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"/>
<?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:09:04