在 Android 资源 ID 之前,美元符号的含义是什么?

2022-09-01 08:56:21

在下面帖子(Android自定义数字键盘)的接受答案中,我发现了一个我不理解的语法:

$(R.id.t9_key_0).setOnClickListener(this);

前面的美元符号是什么意思?它是否与Android资源ID特别相关,或者更像是一种通用的Java语法?搜索引擎结果没有显示任何合适的结果。


答案 1

这是一个方法调用,其中方法名称为 。该方法在您链接的代码中定义如下:$

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

该方法是一个帮助程序,无需强制转换 返回类型 。从Android O开始不再需要它,因为平台findViewById()使用泛型来做同样的事情。findViewById()

这个名字的灵感可能来自jQuery$


答案 2

早些年,我们知道我们需要强制转换每种返回类型的方法。喜欢findViewById()

常用方式

TextView textView = (TextView) findViewById(R.id.textView);

这家伙的方式

TextView textView = $(R.id.textView);

他通过他的泛型方法忽略了类型转换。

所以这个家伙使用Java泛型来忽略所有的类型转换。如果您不了解泛型,请阅读为什么使用泛型findViewById();

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

所以现在他不需要打字

TextView textView = $(R.id.textView);

此方法的说明。

  • 他创建了一个接受资源 ID 的方法。所以他可以通过一个Id。
  • 他通过@IdRes对此参数进行了注释,以便 Android Studio 仅允许在此参数中使用资源 ID。
  • 然后他调用了返回View的超类方法。findViewById
  • 他从方法返回<T 扩展 View>,因此您将始终在返回类型中具有 View 对象。

重要

现在,您无需创建泛型方法。因为Android本身已经改变了他的方法。请参阅 Android Oreo Changes for findViewById()

findViewById() 方法的所有实例现在都返回 T 而不是 View。

现在你也可以像那个家伙一样做同样的事情,而无需打字

TextView textView = findViewById(R.id.textView);

推荐