无法在与findViewById(R.id.textView)相同的行中使用setText()方法

时间:2019-02-06 16:17:39

标签: java android view

我无法在代码中使用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对象,为什么还要进行投射? 谢谢!

4 个答案:

答案 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。让我知道是否有帮助。