在以下帖子(Android custom numeric keyboard)的可接受答案中,我发现了一种我不理解的语法:
$(R.id.t9_key_0).setOnClickListener(this);
前面的美元符号是什么意思?它是否专门与Android资源ID相关,还是更通用的Java语法?搜索引擎结果未显示任何合适的结果。
答案 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);
此方法的说明。
@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);