В чем смысл знака доллара перед идентификатором ресурса 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);