我无法在代码中使用findViewById('R.id.textView').setText("message")
,Android Studio会显示此错误
无法解析方法'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
对象,那么一个线性代码{{1}}也应该工作。
我知道如果我在TextView中进行投射,那么它将起作用。但是我的问题是,如果它已经返回TextView对象,为什么还要进行投射? 谢谢!
答案 0 :(得分:3)
您需要将视图投射到TextView
((TextView)findViewById(R.id.textView)).setText("message")
答案 1 :(得分:2)
您需要将textview
强制转换为TextView
:
((TextView) findViewById(R.id.textView)).setText("message")
答案 2 :(得分:1)
您的示例起作用的原因是因为静态类型赋值(通过变量声明和赋值)保证该对象将是TextView,它确实具有setText()方法,否则将发生运行时异常。
setText()未在View类中定义,因此直接在返回View对象的方法上调用它会导致异常,因为编译器仅知道该方法在返回的View对象中不存在。不会将父母推断为孩子实例。您作为开发人员检查或明确声明(广播或变量声明和赋值)
在findViewById()上对TextView进行显式转换会添加“承诺”,即该对象将是定义了方法的类,因此它将进行编译。
答案 3 :(得分:0)
这是Fragment
中的吗?如果是这样,请确保您使用的是view
中传递的onViewCreated(view: View, savedInstanceState: Bundle?)
。像这样:
view.findViewById<TextView>(R.id.textview).setText("message")
当然,我的回答是用Kotlin编写的,但是您应该可以轻松地转换为Java。让我知道是否有帮助。