【问题标题】:Can't able to use setText() method in same line as findViewById(R.id.textView)无法在与 findViewById(R.id.textView) 相同的行中使用 setText() 方法
【发布时间】:2019-02-06 16:17:39
【问题描述】:

我无法在我的代码中使用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 对象,那么一个线性代码findViewById('R.id.textView').setText("message") 应该也可以工作。

我知道如果我将它投射到 TextView 中,它就会起作用。但我的问题是,如果它已经返回 TextView 对象,为什么我需要强制转换? 谢谢!

【问题讨论】:

    标签: java android view


    【解决方案1】:

    您需要将textview 转换为TextView

    ((TextView) findViewById(R.id.textView)).setText("message")
    

    【讨论】:

    • 谢谢,但如果它已经返回 TextView 对象,为什么我需要强制转换?
    • 编译器不知道该视图将是一个TextView。
    • 这就是为什么如果你先这样做:TextView textview = findViewById(R.id.textview); 编译器接下来就没有问题了:textview.setText("message");
    【解决方案2】:

    您需要将视图转换为TextView

    ((TextView)findViewById(R.id.textView)).setText("message")
    

    【讨论】:

      【解决方案3】:

      您的示例有效的原因是因为静态类型分配(通过变量声明和分配)承诺该对象将是一个 TextView,它确实具有 setText() 方法,否则将发生运行时异常。

      setText() 没有在 View 类中定义,因此直接在返回 View 对象的方法上调用它会导致异常,因为编译器只知道返回的 View 对象中不存在该方法。父母不会被推断为子实例。您作为开发人员检查或明确声明(强制转换或变量声明和赋值)

      将 findViewById() 显式强制转换为 TextView 添加了“承诺”,即该对象将是一个定义了方法的类,因此它可以编译。

      【讨论】:

        【解决方案4】:

        这是在Fragment 中吗?如果是这样,请确保您使用的是在onViewCreated(view: View, savedInstanceState: Bundle?) 中传递的view。像这样的:

        view.findViewById<TextView>(R.id.textview).setText("message")
        

        当然,我的答案是用 Kotlin 编写的,但您应该能够轻松地转换为 Java。让我知道这是否有帮助。

        【讨论】:

        • 嗨,谢谢你的回答,上一个答案解决了我的问题,还是谢谢:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多