web-dev-qa-db-fra.com

Pas besoin de convertir le résultat de findViewById?

Récemment, j'ai découvert qu'AndroidStudio me rappelle de supprimer certains acteurs de la classe. Je me souviens que jadis, nous devions convertir le résultat de findViewById, mais ce n’est plus nécessaire.

Le résultat de findViewById est toujours View, je veux donc savoir pourquoi nous n'avons pas besoin de lancer la classe?

Je ne trouve aucun document mentionné, quelqu'un peut-il trouver un document?

142
Eric Zhao

À partir de l'API 26, findViewById utilise l'inférence pour son type de retour, vous n'avez donc plus besoin de transtyper.

Ancienne définition:

View findViewById(int id)

Nouvelle définition:

<T extends View> T findViewById(int id)

Donc, si votre compileSdk a au moins 26 ans, cela signifie que vous pouvez vous en servir :)

221
Eduard B.

Selon ceci article :

La fonction suivante s’appuie sur l’inférence de type automatique des génériques de Java afin d’éviter le recours à la diffusion manuelle:

protected <T extends View> T findViewById(@IdRes int id) {
    return (T) getRootView().findViewById(id);
}
13
zeroDivider

Dans les anciennes versions:

AutoCompleteTextView name = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);

De Android Studio 3.0 avec le SDK 26:

AutoCompleteTextView name = findViewById(R.id.autoCompleteTextView);
12
Midhun

Android 0, nettoyage du casting

L’une des choses que Google annonce dans IO 2017 est ce qu’on appelle "rejeter" :). Android les développeurs n'ont pas à effectuer de conversion manuelle pour findViewById (). Par exemple, l'ancienne méthode pour obtenir une vue texte à l'aide de findViewById () ressemblerait à ceci.

TextView txtDesc = (TextView) findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

Alors que la nouvelle façon serait comme ça

TextView txtDesc = findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

C’est un changement simple. Mais pour un programmeur expérimenté, un code propre comme celui-ci peut vous rendre très heureux et vous aider dans votre humeur de codage :)

Pour ce faire, il vous suffisait de définir la version 26 de votre projet compilé avec la version de sdk compilée dans votre application build.gradle.

Vous pouvez également cibler une version antérieure du kit de développement logiciel (SDK), ce qui en fait une modification non intrusive.

Maintenant le vrai problème, comment nettoyez-vous cet ancien code qui utilise le casting tout ce temps? Surtout quand vous avez des centaines de fichiers d'activité. Vous pouvez le faire manuellement, ou peut-être embaucher un stagiaire pour le faire ???? Mais heureusement pour tous ces stagiaires, Android studio est déjà prêt à nous aider.

Lorsque vous mettez votre curseur (ou cliquez sur la diffusion redondante) Android le studio suggérera 2 options pour gérer la diffusion redondante.

Tout d'abord, il vous proposera de supprimer cette distribution redondante ou de sélectionner un code de nettoyage. Cela supprimera toute la distribution redondante pour ce fichier. C’est mieux, mais on en veut plus. Nous ne souhaitons pas ouvrir chaque fichier et le nettoyer un par un.

L’une des caractéristiques de l’IntelliJ Special est qu’il s’agit d’une fonctionnalité appelée action intentionnelle. Tout ce que vous avez à faire est d’appuyer sur les touches ctrl + maj + A puis de taper le mot Nettoyer. Et sélectionnez l'action Nettoyer le code, puis sélectionnez toute la portée du projet. Avec ces quelques étapes simples, votre code sera beaucoup plus propre.

Un point important est que vous faites cela avec un système de gestion de version de code. De cette façon, vous pouvez comparer les modifications apportées par l'action intentionnelle et restaurer les fichiers souhaités.

Copié de l'article original:

https://medium.com/@abangkis/Android-0-clean-up-casting-c30acec56cef

1
daliaessam

Android Studio rappelle de supprimer la diffusion si vous utilisez des attributs communs de la classe View, telle que visibilité ou des méthodes courantes, telle que onClick ()

Par exemple:

((ImageView) findViewById(R.id.image_car)).setVisibility(View.VISIBLE);

Dans ce cas, vous pouvez simplement écrire:

findViewById(R.id.image_car).setVisibility(View.VISIBLE);
1
Tim