Android View Binding绑定的Button设置ClickListener不生效问题求助
问题根因
你使用View Binding的逻辑存在错误:通过MainBinding.inflate(layoutInflater)生成的mMainBinding对应一套独立的View实例树,但你setContentView(R.layout.main)是加载了另一套完全独立的、渲染到当前页面的View实例树。你给mMainBinding.loginButton设置的点击事件,实际是作用在未渲染到页面的不可见控件上,自然不会触发。而findViewById能正常生效,是因为它查找的是当前已渲染的View树内的控件,和你页面实际展示的是同一个实例。
修复方案
直接修改onCreate中的setContentView传参,使用Binding实例的根View作为页面渲染内容即可:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mMainBinding = MainBinding.inflate(layoutInflater) // 替换原有setContentView(R.layout.main) setContentView(mMainBinding.root) }
修改完成后,所有通过mMainBinding操作的控件都会和页面实际渲染的控件对应,点击事件即可正常触发,无需额外调用findViewById。
可选适配方案
如果你需要保留setContentView(R.layout.main)的写法,也可以改用bind方法绑定当前已渲染的View树生成Binding实例,效果一致:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) // 绑定当前页面已渲染的View树生成实例 mMainBinding = MainBinding.bind(window.decorView.findViewById(android.R.id.content)) }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

