web-dev-qa-db-fra.com

Android - Ressource attendue de type ID

J'ai ce code

final static int TITLE_ID = 1;
final static int REVIEW_ID = 2;

Maintenant, je veux créer une nouvelle mise en page dans ma classe principale

public View createContent() {
    // create linear layout for the entire view
    LinearLayout layout = new LinearLayout(this);
    layout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.setOrientation(LinearLayout.VERTICAL);

    // create TextView for the title
    TextView titleView = new TextView(this);
    titleView.setId(TITLE_ID);
    titleView.setTextColor(Color.GRAY);
    layout.addView(titleView);

    StarView sv = new StarView(this);
    sv.setId(REVIEW_ID);
    layout.addView(sv);

    return layout;
}

Mais chaque fois que j'appelle TITLE_ID et REVIEW_ID, cela me donne une erreur

Fournir le mauvais type d'identifiant de ressource.
Par exemple, lorsque vous appelez Resources.getString (int id), vous devez transmettre R.string.something, pas R.drawable.something.
Passer la mauvaise constante à une méthode qui attend l'une d'un ensemble spécifique de constantes. Par exemple, lorsque vous appelez View # setLayoutDirection, le paramètre doit être Android.view.View.LAYOUT_DIRECTION_LTR ou Android.view.View.LAYOUT_DIRECTION_RTL.

Je n'ai aucun problème à exécuter ce code. Je me demande simplement pourquoi cela me donne une erreur. Une idée?

44
The Newbie

Ce n'est pas une erreur du compilateur. Il ne s'agit que d'une erreur de validation de l'éditeur (avertissement de peluches), car il ne s'agit pas d'un moyen courant de traiter les identifiants.

Donc, si votre application prenant en charge l’API 17 et supérieure,

vous pouvez appeler View.generateViewId comme

  titleView.setId(View.generateViewId());

et

  sv.setId(View.generateViewId());

et pour API <17

  1. ouvrez le dossier res/values/ de votre projet
  2. créer un fichier XML appelé ids.xml

avec le contenu suivant:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="titleId" type="id" />
    <item name="svId" type="id" />
</resources>

puis dans votre code,

  titleView.setId(R.id.titleId);

et

  sv.setId(R.id.svId);

Et pour désactiver cet avertissement (si vous le souhaitez)

Dans Android Studio, cliquez sur l'ampoule avec cette "erreur". Sélectionnez Désactivez l'inspection dans le premier sous-menu.

99
Giru Bhai

Vous pouvez également désactiver les peluches dans le fichier build.gradle. Ajoutez ces lignes dans votre fichier build.gradle.

Android { 
       lintOptions{
             disable "ResourceType"
       }
}
24
Alvi

J'inclus cela comme une alternative à la "résolution" du problème pour ceux qui ne peuvent pas générer d'ID de vue (c'est-à-dire la définition de l'ID avant que la vue ne soit réellement présente) et que je sache ce qu'ils font.

Directement au-dessus d'une déclaration de variable ou d'une méthode contenant le problème, incluez simplement @SuppressWarnings("ISSUE_IDENTIFIER") pour désactiver l'avertissement de filtre pour cette instance.

Dans ce cas, ce serait @SuppressWarnings("ResourceType")

L'utilisation de méthodes générales pour désactiver le type d'avertissement est mauvaise pratique et peut entraîner des problèmes imprévus, tels que des fuites de mémoire et du code instable. Ne publiez pas de déchets.

Assurez-vous d'annuler l'option pour Disable inspection et supprimez ces lignes du build.gradle:

Android {
    lintOptions{
        disable "ResourceType"
    }
}
6
Abandoned Cart