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

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

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

美元符号前面代表什么?它是否特别与Android资源ID相关或更多地是一般Java语法?搜索引擎结果没有显示任何合适的结果。


他们是在尝试用Java制作jQuery吗?o.O - NoOneIsHere
1
jQuery很好。你一定要尝试使用jQuery。 - Sp0T
2个回答

40

1
在早期,我们知道需要对findViewById()方法的每个返回类型进行强制转换。像这样的方式:
TextView textView = (TextView) findViewById(R.id.textView);

This guy way

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。
  • 然后他调用了超类方法 findViewById,它返回 View。
  • 他从方法中返回了<T extends View>,所以你将始终在返回类型中拥有 View 对象。

重要提示

现在你不需要再编写通用方法了。因为 Android 本身已经更改了他的方法。请参见Android Oreo Changes for findViewById()

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

现在,你也可以像那个人一样做,而无需进行类型转换。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接