Android开发:如何区分LinearLayout中子控件的View与TextView类型?
解决LinearLayout中子控件类型判断的分支冲突问题
这是个很典型的面向对象子类判断优先级问题——因为TextView本身就是View的子类,所以任何TextView对象都会同时通过view is View和view is TextView的检查,导致你两个if分支都会执行一遍。
要解决这个问题,只需要调整判断顺序,并且用互斥的条件逻辑就可以了:
private fun selectFromLayout(ll: LinearLayout, select: Boolean) { val childCount = ll.childCount for (i in 0 until childCount) { val view = ll.getChildAt(i) if (view is TextView) { // 优先处理TextView逻辑,子类判断要放在父类前面 if (select) { view.setTextColor(ContextCompat.getColor(context, R.color.gray_dark)) view.typeface = ResourcesCompat.getFont(context, R.font.montserrat_medium) } else { view.setTextColor(ContextCompat.getColor(context, R.color.gray_medium)) view.typeface = ResourcesCompat.getFont(context, R.font.montserrat_regular) } } else if (view is View) { // 只有非TextView的View才会进入这个分支 if (select) { view.background = ContextCompat.getDrawable(context, R.drawable.back_select) } else { view.setBackgroundResource(R.color.white) } } } }
关键修改说明:
- 调换判断顺序:先检查
view is TextView,因为子类的特征需要优先匹配,避免父类的通用判断先触发 - 改用
else if:把第二个独立if改成else if,让两个分支互斥——当第一个条件(是TextView)满足时,第二个条件会直接跳过,完美实现你想要的逻辑区分
你的LinearLayout布局本身没有问题,里面的TextView和普通View是两个独立控件,修改后的代码会正确处理:
- 遇到
TextView时,仅执行文字样式修改逻辑 - 遇到普通
View时,仅执行背景样式修改逻辑
内容的提问来源于stack exchange,提问作者Mario Muresean
相关产品推荐
相关产品推荐

