IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

getIdentifier() me renvoie un zéro alors qu'il a le bon nom !?!


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 764
    Par défaut getIdentifier() me renvoie un zéro alors qu'il a le bon nom !?!
    Bonjour,

    J'ai créé la méthode suivante pour afficher une photo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public void afficherImage(String path)
    	{
    		ImageView iv = (ImageView) this.findViewById(this.getResources().getIdentifier("image", "id", this.getPackageName()));
    		int ident = getResources().getIdentifier(path, "drawable", getPackageName());
    		iv.setImageResource(ident);
    	}
    j'ai plusieurs photos qui correspondent à des mots comme vous pouvez le voir dans le remplissage de ma HashMap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	public Dao(){
    		//Singleton
    		String s1 ="POULE";
    		String i1 = "poule_336";
     
    		String s2 ="VOITURE";
    		String i2 = "voiture";
     
    		String s3 ="MAISON";
    		String i3 = "maison";
     
    		String s4 ="CHEVAL";
    		String i4 = "cheval";
     
     
    		bddImage = new HashMap<String, String>();
    		bddImage.put(s1, i1);
    		bddImage.put(s2, i2);
    		bddImage.put(s3, i3);
    		bddImage.put(s4, i4);
    	}
    Les photos sont dans le dossier drawable-hdpi et toutes portent la même extension .jpg sauf poule qui est en jpeg ...
    A ce stade, seules les photos de poule et de maison s'affichent. Puis, j'ai décidé de rajouter les photos cheval.jpg et voiture.jpg dans le même répertoire drawable-hdpi.

    Problème : les nouvelles photos ne s'affichent pas (cheval et voiture) et j'aimerais bien savoir pourquoi ?

    J'ai identifié avec le débugger que la ligne suivante position ident à zéro (ce qui signifie que la photo n'a pas été toruvée dans les drawables) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ident = getResources().getIdentifier(path, "drawable", getPackageName());
    J'ai vérifié au debugger que la variable "path" dans la fonction afficherImage contient la bonne variable.
    J'ai vérifié que le nom du fichier image contenu dans drawable-hdpi soit identique au nom que j'ai saisi pour la fabrication de la hashMap.

    Une idée s'il vous plaît ??????

    J'ai fait un test :
    J'ai remplacé les photos qui ne s'affichent pas par des photos qui normalement s'affichent et je leur ai donné le nom de la photo qui ne s'affiche pas. Résultat : pas d'affichage.
    J'ai aussi remplacé, dans la construction du hashMap, les noms des photos qui ne s'affichent pas par des noms de photos qui s'affichent. Résultat : affichage des photos.

    Donc il y a un problème avec le nom des photos ... bizare !

    Si vous avez besoin de plus de renseignements pour m'aider, n'hésitez pas à me demander merci d'avance !


  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 764
    Par défaut
    Bonjour,

    Pour continuer sur le même problème, voici les modifications que j'ai apportées :


    J'ai créé un dossier "photos" dans lequel je met toutes les photos. Ce dossier se trouve dans /res.

    J'ai donc modifié le code à l'endroit où je stocke les adresses dans la hashMap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	public Dao(){
    		//Singleton
    		String s1 ="POULE";
    		String i1 = "/photos/poule_336";
     
    		String s2 ="VOITURE";
    		String i2 = "/photos/poule_336";
     
    		String s3 ="MAISON";
    		String i3 = "./photos/maison.jpg";
     
    		String s4 ="CHEVAL";
    		String i4 = "/photos/cheval";
     
     
    		bddImage = new HashMap<String, String>();
    		bddImage.put(s1, i1);
    		bddImage.put(s2, i2);
    		bddImage.put(s3, i3);
    		bddImage.put(s4, i4);
    	}
    Bon vous remarquerez que les adresses ne sont pas uniformes, c'est parceque je fait pleins d'essais sur les adresses (mettre des points, des slashs, ne rien mettre .. etc)

    J'ai aussi modifié la méthode d'affichage puisque maintenant j'ai le chemin vers la photo et non simplement le nom ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void afficherImage(String chemin)
    	{
    		File drawableFile = new     File(getApplicationContext().getFilesDir().getAbsolutePath() + chemin);
    //		ImageView iv = (ImageView) this.findViewById(this.getResources().getIdentifier("image", "id", this.getPackageName()));
    		ImageView iv = (ImageView) this.findViewById(R.id.image);
    		int ident = getResources().getIdentifier(chemin, "drawable", getPackageName());
    		Drawable d = Drawable.createFromPath(drawableFile.getAbsolutePath());
    //		iv.setBackgroundResource(ident);
    //		iv.setImageResource(ident);
    		iv.setImageDrawable(d);
    	}
    Pour l'instant, je n'arrive pas à afficher.
    C'est quand même terrible qu'il soit aussi compliqué de doner l'ordre depuis le code java d'afficher une photo qui serait dans res/photos !!!

    Merci pour ceux qui veulent bien m'aider ...

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Je pense qu'il y a un problème de conception au niveau de l'application.

    Tu pars de données en resources (donc des "int" fixes).
    Tu veux faire correspondre des données en code static (les "string") avec les chemins dans les ressources.
    Pourquoi dans ce cas là ne pas simplement stocker les "int" des ressources ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class Dao {
     
        private static final String s1 = "POULE";
        private static final Intenger i1 = = Integer.valueOf(R.drawable.poule_36);
     
        private static final String s1 = "VOITURE";
        private static final Intenger i1 = = Integer.valueOf(R.drawable.poule_336);
     
        private static final String s1 = "MAISON";
        private static final Intenger i1 = = Integer.valueOf(R.drawable.maison);
     
        private static final String s1 = "CHEVAL";
        private static final Intenger i1 = = Integer.valueOf(R.drawable.cheval);
     
        bddImage = new HashMap<String, Integer>();
        bddImage.put(s1, i1);
        bddImage.put(s2, i2);
        bddImage.put(s3, i3);
        bddImage.put(s4, i4);
    }
    En général, on utilise getIdentifier() quand on construit le nom de la resource de manière dynamique. Si tu recois le nom depuis un lookup, autant que le lookup retourne directement l'identifiant de la ressource.

    Sinon, pour /photos pas certain que Android gère d'autres répertoires que ceux prédéfinis... Pour les données brutes, c'est "raw" si mes souvenirs sont bons.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 764
    Par défaut
    Bonjour !

    Idée intéressante ! merci
    Je m'en occupe ce soir !

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 764
    Par défaut
    Bonjour,

    La Dao ne connait pas l'application ... R.drawable.poule_336 ne fonctionnera donc pas.

    Je vois trois solutions :
    -1 : Je donne l'appli à la Dao ...
    Est-ce que c'est "bien" que la DAO connaisse l'activity ? la dao ne fait que stocker habituellement ou permet le lien avec la BDD.
    -2 : Je créée une méthode qui va demander l'id au MainActivity en passant par le controleur.
    -3 : peut-être créer un tableau de String avec les mots puis, dans Main, créer une méthode qui donne l'Id des photos à la dao en passant par un setter

    Qu'en pensez-vous ?

    merci,

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 299
    Par défaut
    Bonjour,

    je ne mets pas d'underscore '_' à mes noms d'image.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/01/2008, 19h04
  2. MySQL ne renvoie pas d'erreur alors que la chaine est fausse
    Par repié dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 07/11/2007, 13h18
  3. Réponses: 9
    Dernier message: 26/07/2007, 13h50
  4. no finalement getWidth renvoie toujours zéro. HELP !
    Par Virgile le chat dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 23/06/2007, 02h58
  5. Recordset vide alors que la requete renvoie des valeurs
    Par lepiou dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 07/06/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo