33 votes

Quelle est la signification d'un signe dollar avant un identifiant de ressource Android

Dans la réponse acceptée du message suivant ( clavier numérique personnalisé Android ), j'ai trouvé une syntaxe que je ne comprends pas:

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

Que signifie le signe dollar devant? Est-ce spécifiquement lié aux identifiants des ressources Android ou est-ce plutôt une syntaxe Java générale? Les résultats des moteurs de recherche n'ont montré aucun résultat approprié.

40voto

laalto Points 50581

C'est un appel de méthode où le nom de la méthode est - $. La méthode est définie comme suit dans le code que vous avez lié:

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

La méthode est un assistant, qui supprime la nécessité de jeter le type de retour d' findViewById(). Il n'est plus nécessaire que de Android O la plate-forme de findViewById() utilise des médicaments génériques à faire de même.

Le nom de l' $ est probablement inspiré par jQuery.

1voto

Khemraj Points 8449

Les premiers jours nous savons que nous avons besoin de jeter chaque type de retour d' findViewById() méthode. Comme

de la manière habituelle

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

Ce gars manière

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

Il a ignoré typecasting par sa méthode générique.

Donc, le gars a utilisé Java générique d'ignorer le type coulée de tous les findViewById();. Si vous ne comprenez pas les Génériques, veuillez lire Pourquoi utiliser des génériques.

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

Alors maintenant, il n'a pas besoin de type cast

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

L'explication de cette méthode.

  • Il a créé une méthode qui acceptent id de ressource. Donc, il peut passer à un Id.
  • Il a annoté ce paramètre en @IdRes alors que Android Studio autoriser uniquement les id de ressource dans ce paramètre.
  • Puis, il a appelé super méthode de la classe findViewById qui renvoie Vue.
  • Il est retourné <T extends View> à partir de la méthode, de sorte que vous aurez toujours l'objet de Vue dans le type de retour.

Important

Maintenant, vous n'avez pas besoin de faire de vos méthodes génériques. Parce qu'Android lui-même a changé sa méthode. Voir Android Oreo Changements pour findViewById().

Toutes les instances de la findViewById() la méthode maintenant de retour T au lieu de Vue.

Maintenant, vous peut également faire le même comme le gars sans typecasting

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X