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 :

Array de resources, mais sans XML


Sujet :

Android

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut Array de resources, mais sans XML
    Salut les gars

    je suis sur un casse tête depuis 2 jours, alors un avis extérieur ferait du bien...^^

    Dans le dossier drawable j'ai : decouvrir_0_0.jpg, decouvrir_0_1.jpg, decouvrir_0_2.jpg, decouvrir_1_0.jpg, decouvrir_1_1.jpg, ....

    je voudrais faire une galerie d'images dynamique suivant les images présentes dans drawable, mais à partir d'un prefix que je passe par intent

    exemple, je passe le prefix 'decouvrir_0' à l'activité, on recherche les images drawable qui correspondent à ce prefix, on les stocke dans un tableau Integer et on construit la galerie à partir de ce tableau
    mais sans passer par un fichier XML
    avantages ? on rajoute/supprime une image et la galerie est nouvelle

    Alors, j'ai essayé plein de trucs mais rien ne fonctionne vraiment (je débute sous android et je suis déformé par le PHP, donc vous m'excuserez... ^^) :

    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
     
    //j'abrege
    int k=0;
    while (Res_exists = true){
    String Resou = getIntent().getExtras().getString("categorie").toString()+"_" + k; //cela donne categorie_0_0, categorie_0_1, ...
    //je teste si par exemple la resource 'decouvrir_0_0' existe
    int test = getResources().getIdentifier(Resou, "drawable", getPackageName()); 
    if (test != 0) 
    {//si oui, je la stocke dans un tableau
    mImgs[k] = getResources().getIdentifier(Resou, "drawable", getPackageName());
    k++;
    }
    else// si non, y'en a plus, donc au revoir
    {Res_exists = false;}
     
     
     
    et...
    private Integer[] mThumbIds;
    dans l'API (imageSwitcher), le tableau de stockage des images ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private Integer[] mThumbIds= {
                R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,
                R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7};
    merci bien

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Ce n'est en général pas recommandé de gérer cela de cette façon.
    Pour autant, voici un bout de code qui pourra t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String nameOfResource = "sample_1";
    String typeOfResource = "drawable";
    int id = getResources().getIdentifier(nameOfResource , typeOfResource , getPackageName());

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (Res_exists = true){
    ca ressemble à une boucle infinie tout ça et php n'y est pour rien

    j'ai essayé plein de trucs mais rien ne fonctionne vraiment
    Ca veut dire quoi ça ne fonctionne pas ? Quelles sont les erreurs ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut je sais..
    je sais, mais ça m'arrangerait bien pour l'appli...

    ton bout de code, ne fait il pas la même chose que moi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String Resou = getIntent().getExtras().getString("categorie").toString()+"_" + k;
    int test = getResources().getIdentifier(Resou, "drawable", getPackageName());
    c'est au niveau du test et de l'ajout dans le tableau qu'il y a un hic...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Arf au temps pour moi, j'ai mal compris la question.
    Alors y a-t'il une erreur, l'application s'arrête-t'elle de fonctionner ?

    Et comme l'a remarqué grunk, il y a certainement une erreur à cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (Res_exists = true)
    /*à remplacer par*/
    while (Res_exists)

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2013
    Messages : 70
    Par défaut
    Citation Envoyé par lemaraud Voir le message
    avantages ? on rajoute/supprime une image et la galerie est nouvelle
    Mais les fichiers drawable ne sont pas statique une fois la compilation effectué?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut oui
    oui, exact, j'vais faire un do ^^
    mais à vrai dire, j'ai jamais réussi à afficher l'actvité, donc je n'ai pas pu m'en apercevoir...

    2 ptites minutes, j'étais en train d'arranger un truc, je remets en place et je marque le message d'erreur...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut @ Narion
    Narion, c'est parce que je voudrais répertorier un certain nombre de photos (de 1 à 4 par galerie sur une 20aine de galeries) et je me demandais si je pouvais faire cette solution pour aller plus vite dans la maintenance (ajout/suppression assez fréquent...)

    voila d'après logcat
    06-12 15:48:43.923: E/AndroidRuntime(424): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android_otault/com.example.android_otault.gallery}: java.lang.NullPointerException
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.os.Handler.dispatchMessage(Handler.java:99)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.os.Looper.loop(Looper.java:123)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.app.ActivityThread.main(ActivityThread.java:3683)
    06-12 15:48:43.923: E/AndroidRuntime(424): at java.lang.reflect.Method.invokeNative(Native Method)
    06-12 15:48:43.923: E/AndroidRuntime(424): at java.lang.reflect.Method.invoke(Method.java:507)
    06-12 15:48:43.923: E/AndroidRuntime(424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    06-12 15:48:43.923: E/AndroidRuntime(424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    06-12 15:48:43.923: E/AndroidRuntime(424): at dalvik.system.NativeStart.main(Native Method)
    06-12 15:48:43.923: E/AndroidRuntime(424): Caused by: java.lang.NullPointerException
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.widget.Toast.makeText(Toast.java:258)
    06-12 15:48:43.923: E/AndroidRuntime(424): at com.example.android_otault.gallery.onCreate(gallery.java:80)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    06-12 15:48:43.923: E/AndroidRuntime(424): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    06-12 15:48:43.923: E/AndroidRuntime(424): ... 11 more
    et bien entendu, dès que je commente cette partie, l'activité se lance bien..

    et d'après le debugger, c'est la valeur de int qui pose problème, les autres non

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Le problème est ici : Ligne 80 du fichier gallery.java
    Essaye de faire attention aux conventions de nommage en Java...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.example.android_otault.gallery.onCreate(gallery.java:80)
    Apparemment tu veux afficher un Toast mais tu donne une chaine de caractère null...

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2013
    Messages : 70
    Par défaut
    Donne nous la ligne 80 de ton onCreat en même temps.

    La, pour l'ajout, tu auras pas de problème, mais la suppression t'obligera presque systématiquement à renommé tes images, surtout si tu dois supprimé la première image (_0).
    Donc si tu dois la remplacer, pas de problème, mais une suppression pure ne sera pas forcement un gain de temps....

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut Sans le toast
    oui, je faisais un test avec un toast
    rectificatif, test aurait comme valeur 2130837504 d'après le debugger, donc ce serait la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mThumbIds[k] = getResources().getIdentifier(Resou, "drawable", getPackageName());



    06-12 16:11:00.572: E/AndroidRuntime(541): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android_otault/com.example.android_otault.gallery}: java.lang.NullPointerException
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.os.Handler.dispatchMessage(Handler.java:99)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.os.Looper.loop(Looper.java:123)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.app.ActivityThread.main(ActivityThread.java:3683)
    06-12 16:11:00.572: E/AndroidRuntime(541): at java.lang.reflect.Method.invokeNative(Native Method)
    06-12 16:11:00.572: E/AndroidRuntime(541): at java.lang.reflect.Method.invoke(Method.java:507)
    06-12 16:11:00.572: E/AndroidRuntime(541): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    06-12 16:11:00.572: E/AndroidRuntime(541): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    06-12 16:11:00.572: E/AndroidRuntime(541): at dalvik.system.NativeStart.main(Native Method)
    06-12 16:11:00.572: E/AndroidRuntime(541): Caused by: java.lang.NullPointerException
    06-12 16:11:00.572: E/AndroidRuntime(541): at com.example.android_otault.gallery.onCreate(gallery.java:85)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    06-12 16:11:00.572: E/AndroidRuntime(541): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    06-12 16:11:00.572: E/AndroidRuntime(541): ... 11 more

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Quelle est cette ligne (l.85 du fichier gallery.java) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.example.android_otault.gallery.onCreate(gallery.java:85)

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut
    c'est la ligne de l'ajout dans le tableau...
    à part la déclaration, y'a une initialisation à faire ?

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    C'est difficile de te répondre sans voir le code.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut trouvé
    oui, désolé j'avais mis le plus gros en haut, vu que le reste fonctionne

    j'ai essayé d'initialiser le tableau, et d'ajouter la valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private Integer[] mThumbIds = {R.drawable.decouvrir_0_0};
    private Integer[] mImageIds = {R.drawable.decouvrir_0_0_t};
    pour faire un test, mais sans ajouter via le code ci dessus, et ça fonctionne

    le soucis vient donc de l'ajout dans le tableau, bizarre, bizarre, je regarde ça ce soir...

    merci les gars

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut indice
    j'ai initialisé le tableau avec une valeur en indice 0, je veux donc saisir en indice 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		private Integer[] mThumbIds = {R.drawable.decouvrir_0_0_t};
    		private Integer[] mImageIds = {R.drawable.decouvrir_0_0};
    et voilà la boucle se scan, boucle vite faite, elle fonctionne, je verrai après...

    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
     
    		boolean Res_exists = true;
    		int k=1;
    		do{
    		String Resou = getIntent().getExtras().getString("categorie").toString()+"_" + k;
    		int test = getResources().getIdentifier(Resou, "drawable", getPackageName()); 
     
    			if (test != 0) 
    			{	Toast.makeText(getBaseContext(),mImageIds[0].toString(), Toast.LENGTH_LONG).show(); //m'affiche une valeur correcte donc le tableau existe
    				//mImageIds[1] = test;
    				//mImageIds[k] = getResources().getIdentifier(Resou, "drawable", getPackageName()); //et ça plante à ces 3 lignes 
    				//mThumbIds[k] = getResources().getIdentifier(Resou+"_t", "drawable", getPackageName());
    				k++;
    				//break;
    			}
    			else
    				{Res_exists = false; break;}
    		}
    		while (Res_exists = true);
    merci, truc de dingue...

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Lorsque tu déclare un tableau ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Integer[] mThumbIds = {R.drawable.decouvrir_0_0_t};
    Cela force le tableau à avoir une taille de 1.
    Si tu veux avoir une taille différente il faut faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private int [] mThumbIds = new int [5];
    mThumbIds[0] = R.drawable.decouvrir_0_0_t;
    Si tu veux un tableau de taille dynamique, il faut utiliser autre chose, ArrayList par exemple.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut bien vu
    Merci Simon de la précision, bien vu, j'essaie ça toute à l'heure, mais cela ne doit pas être loin de la vérité
    mais alors, si je le déclare comme ça ; private Integer[] mThumbIds;, quelle taille aura t'il ? (vide et non remplissable ?) Au début c'est ce que je faisais...

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Non, le tableau ne sera pas vide. Il sera null puisqu'il n'a pas été initialisé.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Par défaut impecc'
    impeccable, ça marche mon gars...
    ah là là, j'avais oublié d'initialiser le tableau au début, mais la taille fixe, c'est un truc que je ne connaissais pas... merci

    pour ceux qui voient ce message, voici en complément qui vous permet de réduire la taille du tableau si le nb d'élément dépasse 5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private static Object resizeArray (Object oldArray, int newSize) {
       int oldSize = java.lang.reflect.Array.getLength(oldArray);
       Class elementType = oldArray.getClass().getComponentType();
       Object newArray = java.lang.reflect.Array.newInstance(
             elementType, newSize);
       int preserveLength = Math.min(oldSize, newSize);
       if (preserveLength > 0)
          System.arraycopy(oldArray, 0, newArray, 0, preserveLength);
       return newArray; }
    avec une utilisation (ici)
    mImageIds = (int[])resizeArray(mImageIds, k); (k initialement à 0)

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

Discussions similaires

  1. créer des liens automatiquement mais sans boucle
    Par psychoBob dans le forum Langage
    Réponses: 8
    Dernier message: 15/12/2005, 15h20
  2. appel d un template mais sans etre ds le bon node
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/09/2005, 15h46
  3. Appli MultiFrame mais sans Frame Interne
    Par etiennegaloup dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 05/07/2005, 20h34
  4. Pb de COUNT et GROUP BY simple mais sans requête imbriquées
    Par vanquish dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 09h45
  5. [PostgreSQL]PostgreSQL sous windows mais sans Cygwin
    Par manou dans le forum Administration
    Réponses: 8
    Dernier message: 17/04/2003, 16h19

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