Android资源ID之前的美元符号是什么意思

时间:2018-08-09 12:16:25

标签: java android

在以下帖子(Android custom numeric keyboard)的可接受答案中,我发现了一种我不理解的语法:

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

前面的美元符号是什么意思?它是否专门与Android资源ID相关,还是更通用的Java语法?搜索引擎结果未显示任何合适的结果。

2 个答案:

答案 0 :(得分:40)

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

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

该方法是一个帮助程序,无需强制转换返回类型findViewById()It's no longer needed as of Android O as the platform findViewById() uses generics to do the same.

$这个名字很可能受jQuery的启发。

答案 1 :(得分:1)

以前,我们知道我们需要转换findViewById()方法的每种返回类型。喜欢

常规方式

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

这种家伙的方式

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

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

因此该家伙使用 Java generic 忽略了所有findViewById();的类型转换。如果您不了解泛型,请阅读 Why to use generics

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

所以现在他不需要键入强制转换

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

此方法的说明。

  • 他创建了一种接受资源ID的方法。这样他就可以传递一个ID。
  • 他用 @IdRes 注释了此参数,以便Android Studio仅在此参数中允许资源ID。
  • 然后他调用了超类方法findViewById,该方法返回了View。
  • 他从方法中返回了 <T extends View> ,因此您总是将View对象作为返回类型。

重要

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

  

findViewById()方法的所有实例现在返回   T代替View。

现在,您也可以像那个家伙一样做,而无需进行类型转换

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