В чем смысл знака доллара перед идентификатором ресурса Android
В принятом ответе следующего сообщения (пользовательская цифровая клавиатура Android) я нашел синтаксис, который я не понимаю:
$(R.id.t9_key_0).setOnClickListener(this);
Что означает знак доллара впереди? Является ли это конкретно связано с идентификаторами ресурсов Android или является скорее общим синтаксисом Java? Результаты поиска не показали подходящих результатов.
Ответы
Ответ 1
Это вызов метода, где имя метода - $
. В приведенном коде метод определяется следующим образом:
protected <T extends View> T $(@IdRes int id) {
return (T) super.findViewById(id);
}
Этот метод является помощником, который устраняет необходимость использования возвращаемого типа findViewById()
. Он больше не нужен, как и для Android O, поскольку платформа findViewById()
использует generics для того же.
Имя $
, вероятно, вдохновлено jQuery.
Ответ 2
Раньше мы знали, что нам нужно использовать каждый возвращаемый тип метода findViewById()
. подобно
обычным способом
TextView textView = (TextView) findViewById(R.id.textView);
Этот парень способ
TextView textView = $(R.id.textView);
Он проигнорировал типизацию своим общим методом.
Таким образом, парень использовал Java generic, чтобы игнорировать тип, набрасывающий все findViewById();
, Если вы не понимаете Generics, пожалуйста, прочитайте " Почему использовать дженерики".
protected <T extends View> T $(@IdRes int id) {
return (T) super.findViewById(id);
}
Так что теперь ему не нужно набирать текст
TextView textView = $(R.id.textView);
Объяснение этого метода.
- Он создал метод, который принимает идентификатор ресурса. Поэтому он может передать Идентификатор.
- Он аннотировал этот параметр
@IdRes
чтобы Android Studio разрешала идентификаторы ресурсов в этом параметре. - Затем он вызвал метод супер класса
findViewById
который возвращает View. - Он возвратил метод
<T extends View>
из метода, поэтому у вас всегда будет объект View в обратном типе.
Важный
Теперь вам не нужно создавать свои общие методы. Потому что сам Android изменил свой метод. См. Изменения Android Oreo для findViewById()
.
Все экземпляры метода findViewById() теперь возвращают T вместо View.
Теперь вы также можете делать то же самое, что и этот парень без приведения типов
TextView textView = findViewById(R.id.textView);