web-dev-qa-db-fra.com

Vérifications dans Android Studio "ressource attendue de type"?

Android Studio Beta (0.8) possède une nouvelle fonctionnalité intéressante qui permet de vérifier que certains paramètres int ne sont pas des entiers arbitraires, mais possèdent plutôt certaines propriétés.

Par exemple, appeler quelque chose comme:

setContentView(R.id.textView1);

rapportera correctement que R.id.textView1 n'est pas un identifiant de présentation (le message est "ressource attendue de type présentation"). Il y a d'autres cas de ce poivré autour.

Naturellement, cette protection est perdue dès que vous ajoutez vos propres méthodes, par exemple.

private void mySetContentView(int resourceId) {
    setContentView(resourceId);
}

Je peux alors appeler mySetContentView() avec n'importe quel entier arbitraire et il ne se plaindra pas.

Donc, j'ai deux questions (liées):

  1. Comment cela est-il réalisé - les contrôles spéciaux sont-ils "cuits" en charpie?
  2. Existe-t-il un moyen d'annoter la méthode mySetContentView() pour qu'elle puisse également signaler une erreur de type de ressource lors de son appel avec une valeur non valide?
28
matiash

(Merci à @CommonsWare pour le heads up).

Des annotations Java permettent de prendre en charge ces vérifications dans votre propre code. Ils peuvent tous être trouvés dans le package Android.support.annotations:

  • IdRes
  • DrawableRes
  • LayoutRes
  • StringRes
  • & c

Dans ce cas, par exemple, je pourrais utiliser:

private void mySetContentView(@LayoutRes int resourceId) {
    setContentView(resourceId);
}

et Android Studio vérifiera que l'ID de ressource fourni est bien pour une mise en page.

De plus, ces annotations sont exportées, elles peuvent donc être particulièrement utiles lors de la conception d'une bibliothèque.

Sources:

34
matiash

Ce sont toutes les annotations:

@AnimatorRes
@AnimRes
@AnyRes
@ArrayRes
@AttrRes
@BoolRes
@ColorRes
@DimenRes
@DrawableRes
@FractionRes
@IdRes
@IntDef
@IntegerRes
@InterpolatorRes
@LayoutRes
@MenuRes
@NonNull
@Nullable
@PluralsRes
@RawRes
@StringDef
@StringRes
@StyleableRes
@StyleRes
@XmlRes
20
Kitesurfer

Essayez cette réponse: Cela fonctionne ... Mettez ce code dans votre build.gradle

Android {
 lintOptions {
    disable "ResourceType"
  }
}
8
Mahendran Candy

Toutes les annotations que vous pouvez utiliser avec Android.support.annotation vous pouvez trouver ici .

Et documentation technique sur les annotations de support.

0
Volodymyr Yatsykiv