我能不能在我的代码使用findViewById('R.id.textView').setText("message")
,Android的工作室显示了这个错误
无法解析法“的setText(java.lang.String中)
它是不一样的,因为这问题Android: Why can I not setText in the same line as findViewById在更新的Android版本中,我们不再需要做铸件findViewById()
方法,详细内容见这个问题No need to cast the result of findViewById?
重要的是,相同的代码工作,如果我救findViewById
的结果在一个变量第一(没有它手工铸造的TextView)即
TextView textview = findViewById(R.id.textview);
textview.setText("message");
上面的代码工作正常,如果findViewById返回View
对象那么它也应该不行的,如果返回TextView
对象然后一个线性码findViewById('R.id.textView').setText("message")
应该正常工作。
我知道如果我在TextView中投它,然后它会工作。但我的问题是,为什么我需要投它是否已经返回TextView的对象?谢谢!
你需要投textview
到TextView
:
((TextView) findViewById(R.id.textView)).setText("message")
您需要将视图铸造成一个TextView
((TextView)findViewById(R.id.textView)).setText("message")
您的示例工作的原因是因为静态类型分配(通过变量声明和分配)承诺,对象将是一个TextView,这的确确有setText()方法,或运行时异常会发生。
的setText()未在视图类中定义的,所以直接调用它返回一个异常View对象的结果,因为编译器只知道该方法在返回的视图对象不存在的方法。父母不推断为一个子实例。您作为开发检查或明确说明它(铸造或变量声明和赋值)
在findViewById()来TextView的显式的转换增加了“承诺”,对象将与定义的方法的类,所以它会编译。
这是在Fragment
?如果是这样,请确保您使用的view
内通过onViewCreated(view: View, savedInstanceState: Bundle?)
。事情是这样的:
view.findViewById<TextView>(R.id.textview).setText("message")
就算我的答案写在科特林,但你应该能够调换到Java提供方便。让我知道,如果这有助于。