【问题标题】:How does this version of findViewById() work?这个版本的 findViewById() 是如何工作的?
【发布时间】:2019-02-26 21:32:01
【问题描述】:

View.findViewById()This version 返回View 的最具体的具体子类型:

protected <T extends View> T findViewById(@IdRes int id) {
    return (T) getRootView().findViewById(id);
}

它是如何工作的? 具体来说,在运行时查找id 时,如何在编译时推断类型?跟注解有关系吗?

这与标题相似的问题不同,这些问题是关于findViewById()使用

我想知道为什么它有效。

【问题讨论】:

  • findViewById() 返回一个视图对象。然后将该 Object 强制转换为 T 确定的任何内容。是这个意思吗?

标签: java android generics annotations findviewbyid


【解决方案1】:

无法推断。它使用演员表 - return (T)。调用者负责确保类型 T 与所定位的视图类型相匹配。如果他们弄错了,操作将失败并返回 ClassCastException

类型可以明确指定,即

this.<TextView>findViewById(R.id.someTextView)

(如果我写错了,请原谅我的语法 - 我现在主要处理 Kotlin)

或者可以从目的地推断:

TextView foundView = findViewById(R.id.someTextView)

但无论哪种情况,责任都在于调用者。

Android 工具链可能会做进一步的工作来交叉引用布局 XML 与代码,并在您的 IDE 中产生警告或故障,但这是在 Java 运行时执行的之上的编译时层。

它与 @IdRes 注释无关,它在编译时再次断言 id 参数是对某些基于 XML 的实体的 ID 的引用,而不仅仅是任何整数价值。

【讨论】:

  • 谢谢!我缺少的是可以从目的地推断出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多