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

startActivityForResult废弃后,BottomNavigationView选图显示到RecyclerView的方案

实现方案(替代startActivityForResult的图片选择与RecyclerView展示)

1. 注册Activity Result Launcher

在你的Activity或Fragment中,使用Activity Result API替代已废弃的startActivityForResult,先注册用于选择图片的启动器:

Kotlin 代码

// 作为Activity/Fragment的成员变量
private val pickImageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
    uri?.let { selectedUri ->
        // 处理选中的图片Uri
        addImageToRecyclerView(selectedUri)
    }
}

Java 代码

// 成员变量
private ActivityResultLauncher<String> pickImageLauncher;

// 在onCreate()中初始化
pickImageLauncher = registerForActivityResult(
    new ActivityResultContracts.GetContent(),
    uri -> {
        if (uri != null) {
            addImageToRecyclerView(uri);
        }
    }
);

2. 监听BottomNavigationView的选中事件

设置导航项的选中监听,当点击R.id.status时触发图片选择:

Kotlin 代码

bottomNavigationView.setOnItemSelectedListener { item ->
    when (item.itemId) {
        R.id.status -> {
            // 启动图片选择器,指定仅选择图片类型
            pickImageLauncher.launch("image/*")
            true
        }
        // 处理其他导航项
        else -> false
    }
}

Java 代码

bottomNavigationView.setOnItemSelectedListener(item -> {
    if (item.getItemId() == R.id.status) {
        pickImageLauncher.launch("image/*");
        return true;
    }
    return false;
});

3. 处理图片并更新RecyclerView

定义数据源与适配器

首先维护一个存储图片Uri的数据源,再实现RecyclerView的适配器用于展示图片:

数据源初始化(Kotlin)

private val imageUris = mutableListOf<Uri>()
private lateinit var statusAdapter: StatusAdapter

适配器示例(Kotlin)

class StatusAdapter(private val imageUris: List<Uri>) : RecyclerView.Adapter<StatusAdapter.ViewHolder>() {

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val statusImage: ImageView = itemView.findViewById(R.id.status_image)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_status_image, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val imageUri = imageUris[position]
        // 用Glide加载图片(需添加Glide依赖),也可使用Picasso或原生API
        Glide.with(holder.statusImage.context)
            .load(imageUri)
            .centerCrop()
            .into(holder.statusImage)
    }

    override fun getItemCount() = imageUris.size
}

初始化RecyclerView(Kotlin)

// 在onCreate()或onViewCreated()中
statusList.apply {
    layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
    statusAdapter = StatusAdapter(imageUris)
    adapter = statusAdapter
}

更新RecyclerView数据

实现添加图片并刷新列表的方法:

private fun addImageToRecyclerView(uri: Uri) {
    imageUris.add(uri)
    // 通知适配器插入新数据,优化性能
    statusAdapter.notifyItemInserted(imageUris.size - 1)
    // 可选:自动滚动到最新添加的图片
    statusList.smoothScrollToPosition(imageUris.size - 1)
}

4. 权限注意事项

  • Android 13及以上:需要申请READ_MEDIA_IMAGES权限
  • Android 12及以下:需要申请READ_EXTERNAL_STORAGE权限
  • 可在代码中动态申请权限,确保图片选择器能正常访问设备存储。

内容的提问来源于stack exchange,提问作者Mr. X

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:52:31