为何findViewById未返回正确视图类型?代码问题排查求助
嘿,这个问题其实挺典型的,我来帮你把逻辑理清楚~
首先,核心原因很简单:默认的findViewById()方法返回的是View类型,而setTextSize()是TextView类特有的方法,View父类并没有提供这个方法。所以你直接链式调用的时候,编译器会认为你在调用View的方法,自然会报错。
那为什么第一段代码能正常运行呢?
当你把findViewById()的结果赋值给TextView类型的变量时,编译器会帮你做类型推断或隐式转换检查(如果你的项目配置了API 26+或者AndroidX支持的话),自动确认这个View确实是TextView类型,所以可以正常调用方法。
你之前尝试强转没成功,大概率是括号优先级的问题!比如你可能写了:
(TextView) findViewById(chain.getIngredientNameId()).setTextSize(8);
这种写法的问题在于,编译器会先执行findViewById(...).setTextSize(8),再尝试把结果强转成TextView——但findViewById()返回的View根本没有setTextSize()方法,自然会报错。
正确的解决方法有两种:
显式强转(注意括号层级)
先把findViewById()的结果强转成TextView,再调用方法,需要给强转部分套一层额外的括号:((TextView) findViewById(chain.getIngredientNameId())).setTextSize(8);使用泛型版本的
findViewById()
如果你的项目基于API 26及以上,或者使用了AndroidX库,可以直接指定泛型类型,让方法返回对应的View子类:findViewById<TextView>(chain.getIngredientNameId()).setTextSize(8);(如果是Java环境,也可以用
TextView.class.cast(findViewById(chain.getIngredientNameId())).setTextSize(8);来实现类似效果)
这样链式调用就能正常工作啦~
内容的提问来源于stack exchange,提问作者Mairyu

