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
相关产品推荐
相关产品推荐

