如何用findViewById更新非onCreate加载布局中的TextView
问题本质
findViewById()的查找范围是你调用这个方法的View实例下属的、已经完成inflate加载到内存的视图树。你在onCreate里setContentView加载的布局和目标TextView所属布局是完全独立的两个文件,后者没有被inflate进当前页面的视图树,你直接调用Activity的findViewById当然匹配不到对应ID的控件。
实现步骤
你需要先加载目标独立布局拿到它的根View引用,再基于这个根View做控件查找,操作流程如下:
- 第一步:使用LayoutInflater加载目标独立布局,获取布局对应的根View对象
// 替换成你自己的独立布局ID,比如R.layout.your_separate_layout val separateLayoutRoot = LayoutInflater.from(this).inflate( R.layout.your_separate_layout, null, false ) // Java代码参考: // View separateLayoutRoot = LayoutInflater.from(this).inflate(R.layout.your_separate_layout, null, false);
- 第二步:调用根View对象的
findViewById()方法查找目标TextView,注意不要直接调用Activity/Fragment的findViewById
val targetTv: TextView = separateLayoutRoot.findViewById(R.id.callable_textview) // 拿到实例后就可以正常更新控件内容 targetTv.text = "你要设置的文本内容"
- 第三步:如果你需要在界面上展示这个独立布局,再把持有了控件引用的
separateLayoutRoot挂载到对应位置即可,比如作为AlertDialog的视图、通过addView添加到当前页面的父容器中。
注意事项
如果目标独立布局属于其他Activity、Fragment或者自定义组件,不要尝试在当前页面跨组件查找控件:这种方式不仅查找链路长性能差,还很容易拿到已经被销毁的控件实例引发空指针、内存泄漏。这种场景建议通过共享的ViewModel、或者统一的数据层维护要展示的文本内容,等目标布局所属组件自己加载布局时,再完成数据和控件的绑定。
内容的提问来源于stack exchange,提问作者try_hard
相关产品推荐
相关产品推荐

