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 :

OnClickListener renvoyant null


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur frontend
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur frontend

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 56
    Points
    56
    Par défaut OnClickListener renvoyant null
    Bonjour à tous,

    après avoir fait plein de tests et écumés le net, je me permets de poster mon problème. Je cherche à faire un EditText avec un bouton qui me permet de chercher une location via l'API GoogleMaps. Le problème étant que lorsque je clique j'ai une erreur: la méthode onClick() renvoie la valeur Erreur: null j'ai pourtant testé avec un Toast la valeur de v.getId() qui est bien mon bouton en l'occurence.

    Voici une partie de mon code:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
     
    	<LinearLayout
    	    android:id="@+id/searchLayout"
    	    android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:layout_alignRight="@+id/map"
    	    android:orientation="horizontal" >
     
        <EditText
            android:id="@+id/searchLocation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="@string/hint"
            android:inputType="text" />
     
        <Button
            android:id="@+id/bouton1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.12"
            android:text="@string/button1" />
     
        </LinearLayout>
     
        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.MapFragment"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_below="@id/searchLayout" />
     
    </RelativeLayout>
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    searchButton = (Button) findViewById(R.id.bouton1);
    searchButton.setOnClickListener(this);
    @Override
    	public void onClick(View v) {
     
     
    		try {
    			if(v == searchButton){
     
    				Geocoder geocoder = new Geocoder(MainActivity.this);
    				search = recherche.getText().toString();
    				try {
    					List<Address> customAddress = geocoder.getFromLocationName(search, 4);
     
    					if(customAddress.size() > 0){
     
    						double latitude = customAddress.get(0).getLatitude();
    						double longitude = customAddress.get(0).getLongitude();
     
     
    						map.addMarker(new MarkerOptions()
    							.position(new LatLng(latitude, longitude))
    							.title("Résultat de la recherche")
    							.snippet(search)
    								);
     
    					} else {
     
    						Toast.makeText(MainActivity.this, "La recherche n'a pas abouti", Toast.LENGTH_LONG).show();
    					}
    				} catch (IOException e) {
     
    					e.printStackTrace();
    				}
    			} else {
     
    				Toast.makeText(MainActivity.this, "Merci de saisir une location valide", Toast.LENGTH_SHORT).show();
    			}
     
     
     
    		}
     
    		catch(Exception O) {
     
    				Toast.makeText(MainActivity.this, "Erreur: " + O.getMessage(), Toast.LENGTH_LONG).show();
    		}
     
     
    	}
    L'interface OnClicklistener est bien implémentée ainsi que la méthode onClick() inhérente.
    Est ce que le fait que fait que l'EditText et le bouton soient dans un LinearLayout compris dans le RelativeLayout peut être un soucis?
    Si quelqu'un a un avis sur mon problème...
    Merci d'avance.

  2. #2
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    Tu as essayé de faire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Button button1 = (Button) findViewById(R.id.bouton1);
    button1.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
     
       }
      });
    Je ne pense pas que ca corrige ton soucis, mais ca ne sert pas à grand chose de mettre l'écouteur sur l'activité pour un seul bouton.

    Enlève ton try catch, il ne sert à rien et donne nous le log exacte ou il y a erreur, ça va être compliqué de t'aider sinon.
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur frontend
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur frontend

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 56
    Points
    56
    Par défaut
    Merci pour ta réponse, voici les logs au moment de l'erreur:

    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
     
     
    02-14 08:02:14.930: E/AndroidRuntime(13085): FATAL EXCEPTION: main
    02-14 08:02:14.930: E/AndroidRuntime(13085): Process: fr.terry.googlemapstutorial, PID: 13085
    02-14 08:02:14.930: E/AndroidRuntime(13085): java.lang.NullPointerException
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at fr.terry.googlemapstutorial.MainActivity.onClick(MainActivity.java:246)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at android.view.View.performClick(View.java:4438)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at android.view.View$PerformClick.run(View.java:18422)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at android.os.Handler.handleCallback(Handler.java:733)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at android.os.Handler.dispatchMessage(Handler.java:95)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at android.os.Looper.loop(Looper.java:136)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at java.lang.reflect.Method.invokeNative(Native Method)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at java.lang.reflect.Method.invoke(Method.java:515)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    02-14 08:02:14.930: E/AndroidRuntime(13085): 	at dalvik.system.NativeStart.main(Native Method)
    J'ai bien une exception NullPointer et ai cherché un peu partout pour le résoudre (nettoyage du projet etc.) mais je ne parviens pas à me débugger.
    J'ai bien essayé ce que tu suggères pour éviter d'implémenter OnClickListener pour un seul bouton mais l'application crash toujours.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur frontend
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur frontend

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 56
    Points
    56
    Par défaut
    en fait je m'auto réponds, j'ai trouvé l'erreur (de débutant) qui vient du fait que je n'ai pas instancié l'EditText qui est censée récupérer la valeur saisie dans mon MainActivity. D'où l'exception NullPointer.

    En revanche si cela peut servir à quelqu'un, j'ai vu sur la doc officielle que le Geocoder n'était pas censé prendre en charge les locations saisies par l'utilisateur et qu'il fallait y préférer d'autres APIs de location: https://developers.google.com/maps/d...ding/index#BYB
    Mais certains développeurs ont tout de même créés une classe permettant de l'utiliser à ces fins, voir la classe GeocoderTask à cette adresse: http://wptrafficanalyzer.in/blog/and...ndroid-api-v2/ il y aussi un GIT sur ce point

  5. #5
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Et voir aussi le bug officiel Android 38009 : https://code.google.com/p/android/is...etail?id=38009

    Parfois, le Geocoder se désynchronise et remontera toujours son IOException. Seule solution : rebooter le terminal.
    Le workaround étant de passer par une autre API de recherche, l'API web de la GMap par exemple.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur frontend
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur frontend

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 56
    Points
    56
    Par défaut
    Du coup, Hizin tu utiliserais quelle API dans ce contexte (entrée utilisateur)?

  7. #7
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    A cause de ça, j'utilise en premier le Geocoder, et si celui-ci est indisponible, je passe par l'API web de la GMap. Je préfère ne pas afficher aux utilisateurs "En raison d'un bug d'Android, vous devez redémarrer votre terminal pour avoir accès à cette fonctionnalité".
    Je trouve que ce n'est pas génial, surtout dans une appli qui utilise intensivement la géoloc et le reverse geocoding, mais je n'ai pas trouvé d'autre solution. Bon, j'ai cherché il y a 6 mois, et j'étais pressé par le temps, donc il y a potentiellement mieux.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur frontend
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur frontend

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 56
    Points
    56
    Par défaut
    Ok merci pour l'info. A ce sujet si j'ai bien compris, on peut utiliser des données venant de l'API MAPS Javascript et de récupérer les données via JSON? Désolé de te harceler de questions, je débute...

  9. #9
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Pas de souci, les forums d'entraide sont fait pour ça

    Oui, tu peux traiter le retour en JSON, et c'est assez facile à faire.

    Au niveau de l'archi, ça donne 2 AsyncTask : la première appelle le Geocoder, et la second appelle l'API GMaps. La seconde n'est lancée que dans le cas où le Geocoder foire, ceci indiqué par un flag dans l'AsyncTask (le Geocoder peut normalement retourner null, de mémoire, donc se baser uniquement là-dessus n'est pas forcément une bonne idée).
    Par contre, je n'ai pas le code sous les yeux, donc là, je ne pourrai pas plus aider pour ça.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur frontend
    Inscrit en
    Octobre 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur frontend

    Informations forums :
    Inscription : Octobre 2013
    Messages : 75
    Points : 56
    Points
    56
    Par défaut
    C'est noté je vais aller jeter un coup d’œil à tout ça, merci beaucoup pour les infos

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

Discussions similaires

  1. AJAX + JSON: caractères accentués renvoyant "null"
    Par t3__rrY dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/08/2014, 16h23
  2. Propriété SelectedValue d'un combobox renvoyant NULL
    Par devman2011 dans le forum ADO.NET
    Réponses: 8
    Dernier message: 06/01/2012, 16h09
  3. FB 2.1 renvoyer null dpuis une udf
    Par jlf dans le forum Firebird
    Réponses: 0
    Dernier message: 04/05/2010, 14h51
  4. [SQL Server 2000] Renvoyer NULL lorsqu'un CAST échoue
    Par J1 dans le forum Développement
    Réponses: 2
    Dernier message: 02/03/2010, 18h49
  5. [BDD] renvoyer une chaine vide au lieu de null
    Par cmoulin dans le forum JDBC
    Réponses: 6
    Dernier message: 06/05/2004, 11h38

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