调用指定布局的findViewById未关联 修改字体颜色不生效如何解决
问题根因
你通过LayoutInflater加载得到的row.xml对应View实例,没有被添加到Activity的显示视图树中,你修改的是未挂载的孤立View内的控件属性,不会在界面上生效。
解决方案
分两种常用场景处理:
- 已在主布局通过
<include>引入row.xml的场景
不需要手动inflate布局,在setContentView加载主布局后直接查找目标控件即可:// 优先加载主布局,必须在所有控件查找前调用 setContentView(R.layout.你的主布局文件名); // 直接查找include布局内的TextView textfont = findViewById(R.id.textItemmain); // 此处修改字体、颜色即可生效 textfont.setTextColor(Color.RED); textfont.setTypeface(自定义字体实例); - 需要动态添加
row.xml到界面的场景
先拿到主布局内的目标容器,inflate后将View添加到容器中再修改属性:setContentView(R.layout.你的主布局文件名); // 主布局中用来承载row的容器,比如LinearLayout/FrameLayout等 LinearLayout container = findViewById(R.id.你的容器id); LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 第二个参数传父容器,第三个参数传false避免提前挂载 View view = inflater.inflate(R.layout.row, container, false); textfont = (TextView) view.findViewById(R.id.textItemmain); // 修改属性 textfont.setTextColor(Color.RED); textfont.setTypeface(自定义字体实例); // 将row对应的View添加到容器,才会显示到界面 container.addView(view);
注意事项
- 禁止调用
inflater.inflate(R.layout.row, null),第二个参数传null会导致row布局根节点的layout_开头的布局属性失效,必须传入父容器作为第二个参数。 - 所有控件查找、属性修改操作必须在
setContentView执行之后调用,否则会出现空指针异常。
内容的提问来源于stack exchange,提问作者Hicham
相关产品推荐
相关产品推荐

