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 :

setOnClickListener pour une image contenue dans un adapter


Sujet :

Android

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut setOnClickListener pour une image contenue dans un adapter
    Bonjour =)

    Je cherche comment attacher un listener sur une imageView contenue dans un layout.xml "appelée" depuis un adapter qui se trouve dans le layout principal.

    Habituellement, je procède ainsi pour attacher des éléments qui se situes dans le layout principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findViewById(R.id.adapteurprincipal).setOnClickListener(this); //pour le cas d'un bouton par exemple
    Donc naïvement, j'ai tenté la même pour mon image et j'ai eu droit à mon exception et fermeture du programme ^^
    Après quelques essais, j'ai tenté l'approche suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findViewById(R.id.adapteurprincipal).findViewById(R.id.image).setOnClickListener(this);
    Mais pareil, erreur lors du lancement du programme (Fatal Exeption blablabla...)

    J'ai essayé de le faire en plusieurs lignes pour mieu localiser la source du problème...j'arrive jusqu'à ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImageView image = (ImageView)adapter_view.findViewById(R.id.image);
    image.setOnClickListener(this);
    Et ça plante à la seconde ligne...j'ai l'impression que j'utilise mal l'argument du setOnClickListener, mais je ne comprend pas très bien l'erreur...

    Merci pour votre aide =)

  2. #2
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Est ce que a chaque fois il est possible d'avoir l'exception en entier ? (dans le logcat, exception+stacktrace associée)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    Oui bien sur =)
    Je n'ai qu'une activity principale (je précise au cas ou...)

    Désolé, j'avais jeté un coup d’œil aux messages d'erreurs sans y avoir trouvé d'info utiles (mais je me trompe peut être) donc je ne les avaient pas mis au premier post les voici !

    pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findViewById(R.id.image).setOnClickListener(this);
    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
    12-20 12:48:11.395: E/AndroidRuntime(10988): FATAL EXCEPTION: main
    12-20 12:48:11.395: E/AndroidRuntime(10988): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tpcontentprovider/com.example.tpcontentprovider.MainActivity5}: java.lang.NullPointerException
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.ActivityThread.access$600(ActivityThread.java:122)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.os.Looper.loop(Looper.java:137)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.ActivityThread.main(ActivityThread.java:4340)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at java.lang.reflect.Method.invokeNative(Native Method)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at java.lang.reflect.Method.invoke(Method.java:511)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at dalvik.system.NativeStart.main(Native Method)
    12-20 12:48:11.395: E/AndroidRuntime(10988): Caused by: java.lang.NullPointerException
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at com.example.tpcontentprovider.MainActivity5.onCreate(MainActivity5.java:35)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.Activity.performCreate(Activity.java:4465)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    12-20 12:48:11.395: E/AndroidRuntime(10988): 	... 11 more

    pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findViewById(R.id.adapteurprincipal).findViewById(R.id.image).setOnClickListener(this);
    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
    12-20 12:52:35.606: E/AndroidRuntime(12734): FATAL EXCEPTION: main
    12-20 12:52:35.606: E/AndroidRuntime(12734): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tpcontentprovider/com.example.tpcontentprovider.MainActivity5}: java.lang.NullPointerException
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.ActivityThread.access$600(ActivityThread.java:122)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.os.Looper.loop(Looper.java:137)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.ActivityThread.main(ActivityThread.java:4340)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at java.lang.reflect.Method.invokeNative(Native Method)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at java.lang.reflect.Method.invoke(Method.java:511)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at dalvik.system.NativeStart.main(Native Method)
    12-20 12:52:35.606: E/AndroidRuntime(12734): Caused by: java.lang.NullPointerException
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at com.example.tpcontentprovider.MainActivity5.onCreate(MainActivity5.java:35)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.Activity.performCreate(Activity.java:4465)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    12-20 12:52:35.606: E/AndroidRuntime(12734): 	... 11 more
    et pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImageView image=(ImageView)adapter_view.findViewById(R.id.image);
    image.setOnClickListener(this);
    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
    12-20 12:53:45.975: E/AndroidRuntime(13196): FATAL EXCEPTION: main
    12-20 12:53:45.975: E/AndroidRuntime(13196): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tpcontentprovider/com.example.tpcontentprovider.MainActivity5}: java.lang.NullPointerException
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.ActivityThread.access$600(ActivityThread.java:122)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.os.Looper.loop(Looper.java:137)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.ActivityThread.main(ActivityThread.java:4340)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at java.lang.reflect.Method.invokeNative(Native Method)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at java.lang.reflect.Method.invoke(Method.java:511)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at dalvik.system.NativeStart.main(Native Method)
    12-20 12:53:45.975: E/AndroidRuntime(13196): Caused by: java.lang.NullPointerException
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at com.example.tpcontentprovider.MainActivity5.onCreate(MainActivity5.java:34)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.Activity.performCreate(Activity.java:4465)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    12-20 12:53:45.975: E/AndroidRuntime(13196): 	... 11 more
    Pour ce dernier essais, la ligne 34 du "com.example.tpcontentprovider.MainActivity5" est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image.setOnClickListener(this);
    Pour les essais précédant, les erreurs pointent bien vers les lignes que j'ai montrées au premier post.

  4. #4
    Jay
    Jay est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2002
    Messages : 124
    Points : 189
    Points
    189
    Par défaut
    Bonjour,

    C'est dans l'adapteur que tu dois mettre ton listener et non dans ton activité principal.

    Cordialement,

  5. #5
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Forcément si je ne lis le titre qu'à moitié....

    Mais bon... pour que le copy/paste du logcat ne serve pas à rien....
    Caused by: java.lang.NullPointerException
    12-20 12:48:11.395: E/AndroidRuntime(10988): at com.example.tpcontentprovider.MainActivity5.onCreate(MainActivity5.java:35)

    Soit utilisation d'un membre (variable ou fonction) d'un objet 'null' dans:
    findViewById(R.id.image).setOnClickListener(this);

    C'est à dire que findViewById(R.id.image) retourne null
    Soit encore que R.id.image n'existe pas dans le layout de l'activité...

    Ce qui est le cas puisqu'il est dans le layout d'un ITEM de la listview...

    Question 1: As tu besoin que le click soit sur l'image uniquement ? ou sur l'item complet ? (en général on préfère l'item complet pour des question d'utilisabilité)

    Si oui, alors il faut mettre le code dans l'adapter (le seul à 'connaitre' le layout)

    Si non, alors il faut mettre le code dans l'activité mais avec la fonction setOnItemClickListener de la ListView.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    Merci pour vos réponses déjà =)
    Pour répondre à la question, mon adapteur concerne plusieurs éléments différents, il y a une image, du textView etc...

    Donc idéalement, j'aimerai que ça ne soit Que l'image qui soit cliquable ..
    Donc il est vrai que je pourrais mettre un setOnClickListener directement sur l'adapteur, mais je préfère l'image (puis vu que je ne sais pas faire encore, ça m’intéresse dans l'absolue de savoir comment s'y prendre )

    Et oui je pense voir du coup. Effectivement, mon adapteur est un adapteur perso (donc avec sa classe) où je capte directement l'image sans problème. Donc oui, pourquoi ne pas coller le listener à ce niveau là..

    Je test ça, et je vous donne mon retour =)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    C'est tout bon ! j'ai un peu pris du temps sur un Toast dont je n'arriveais pas à attraper le contexte de la classe Activity depuis mon adapteur perso mais j'y suis arrivé aussi

    Allez, résolu, merci encore !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/05/2007, 17h43
  2. [Zip] Afficher une image contenue dans un fichier zip
    Par Mister Nono dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 19/03/2007, 08h59
  3. est ce qu on peu dimensionner une Image contenu dans un Jlabel
    Par uzumaki_naruto dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 24/02/2007, 16h33
  4. Réponses: 6
    Dernier message: 29/07/2005, 11h12
  5. [JAR] instancier une Image contenue dans un jar
    Par celine31 dans le forum Général Java
    Réponses: 3
    Dernier message: 03/04/2005, 15h55

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