Android Kotlin 访问其他Fragment内Button报空指针异常
错误原因
findViewById的搜索范围是当前调用者对应的View层级:你在MainActivity里调用该方法,只会搜索Activity通过setContentView加载的布局里的控件。
你要绑定的R.id.buttonbck定义在Fragment的独立布局中:
- Fragment的视图是在自身生命周期内动态挂载到Activity上的,Activity执行
findViewById时,大概率Fragment的视图还没完成加载 - 就算Fragment已经加载,跨层级直接查找Fragment内部控件本身就不符合Android视图查找规则,最终返回值为null,调用
setOnClickListener就会触发你看到的空指针异常。
顺带一提,你代码里后续查找R.id.webViewBrowse的逻辑也有同样问题,如果这个WebView也属于Fragment布局,同样会返回null。
正确修复方案
- 优先方案:控件逻辑下沉到对应Fragment
把按钮绑定、点击逻辑全部移动到持有该按钮的Fragment中,这是最符合Android架构规范、不会出现生命周期问题的写法:// 持有buttonbck按钮的Fragment代码 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 用Fragment自身加载的根view做查找,不要调用Activity的findViewById val backBtn = view.findViewById<Button>(R.id.buttonbck) val browseWebView = view.findViewById<WebView>(R.id.webViewBrowse) backBtn.setOnClickListener { browseWebView.goBack() Toast.makeText(requireContext(), "Back", Toast.LENGTH_SHORT).show() } } - 如果业务要求必须在Activity中响应这个按钮的点击,不要直接跨层级查找Fragment控件,通过Fragment Result API或者共享ViewModel实现Fragment和Activity的通信,避免视图生命周期不匹配引发的空指针。
注意:不要尝试在Activity中等待Fragment加载完成后再通过Fragment实例拿view查找控件,这种写法耦合度极高,一旦Fragment发生重建、视图销毁,会再次触发空指针,仅适合做临时调试用,禁止写在正式业务代码里。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

