Kotlin中Fragment里setOnClickListener无法正常工作问题求助
解决方案
直接通过view.Notification获取ImageView是错误的,View类并没有该属性,Kotlin无法直接通过这种方式识别XML中的控件ID,以下是两种可行的解决办法:
方法一:使用findViewById
修改代码,先通过findViewById获取ImageView实例,再设置点击监听:
class Home : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view: View = inflater!!.inflate(R.layout.fragment_home, container, false) val notificationImageView = view.findViewById<ImageView>(R.id.Notification) notificationImageView.setOnClickListener { Log.d("btnSetup", "Selected") } return view } }
方法二:使用View Binding(推荐)
这是更简洁、类型安全的方式,步骤如下:
- 开启View Binding:在模块级
build.gradle文件中添加配置:
android { ... buildFeatures { viewBinding true } }
- 修改Fragment代码:
class Home : Fragment() { private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentHomeBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.Notification.setOnClickListener { Log.d("btnSetup", "Selected") } } override fun onDestroyView() { super.onDestroyView() _binding = null // 防止内存泄漏 } }
注:
FragmentHomeBinding是系统根据你的fragment_home.xml自动生成的绑定类,类名由XML文件名驼峰化后加Binding后缀得到。
内容的提问来源于stack exchange,提问作者Dev Sagar
相关产品推荐
相关产品推荐

