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

Fragment中从相册选图后无法显示至ImageView的问题排查

问题:Fragment中选择图片后无法显示在ImageView中

我希望实现一个Fragment功能:点击按钮打开相册,选择图片后将该图片显示在ImageView中。目前流程正常(点击按钮可弹出相册,能选择图片),但选中的图片无法显示在ImageView中。

以下是我编写的代码:

class PostFragment : Fragment(R.layout.fragment_post) {

    companion object{
        val IMAGE_REQUEST_CODE = 100
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View{
        val rootView: View = inflater.inflate(R.layout.fragment_post, container, false)

        var ButtonChooseImage: Button = rootView.findViewById(R.id.button_choose_image)
        var postImage: ImageView = rootView.findViewById(R.id.postImage)
        ButtonChooseImage.setOnClickListener{
            openFileChooser()
        }
        return rootView
    }

    private fun openFileChooser() {
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = "image/*"
        startActivityForResult(intent, IMAGE_REQUEST_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        val rootView: View = layoutInflater.inflate(R.layout.fragment_post,null)
        var postImage: ImageView = rootView.findViewById(R.id.postImage)

        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode == IMAGE_REQUEST_CODE && resultCode == RESULT_OK){

            postImage.setImageURI(data?.data)
        }
    }
}

错误原因

你在onActivityResult方法里重新inflate了一个全新的rootView,这个View对象和Fragment当前展示在界面上的View没有任何关联。你给这个新创建的ImageView设置图片,自然不会在用户看到的界面上生效。

修正方案

把ImageView的引用提升为Fragment的成员变量,在onCreateView中完成初始化,这样onActivityResult就能直接操作界面上真实存在的ImageView实例。

修正后的代码:

class PostFragment : Fragment(R.layout.fragment_post) {

    companion object{
        val IMAGE_REQUEST_CODE = 100
    }

    // 声明成员变量保存ImageView引用
    private lateinit var postImage: ImageView

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View{
        val rootView: View = inflater.inflate(R.layout.fragment_post, container, false)

        val ButtonChooseImage: Button = rootView.findViewById(R.id.button_choose_image)
        postImage = rootView.findViewById(R.id.postImage) // 初始化成员变量
        ButtonChooseImage.setOnClickListener{
            openFileChooser()
        }
        return rootView
    }

    private fun openFileChooser() {
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = "image/*"
        startActivityForResult(intent, IMAGE_REQUEST_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode == IMAGE_REQUEST_CODE && resultCode == RESULT_OK){
            // 直接使用成员变量设置图片
            postImage.setImageURI(data?.data)
        }
    }
}

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:50:32