Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cours Android Erreur

Sujet résolu
    28 octobre 2014 à 19:50:51

    Bonjour a tous,

    Je débute actuellement dans la programmation en Java pour Android et j'ai commencé le cours Créez des applications pour Android.

    Cependant, je suis au chapitre 2 "Création d'interfaces graphiques" partie 1 "Constitution des interfaces graphiques" et je bloque sur la fin.

    Mon interface est composée d'un TextView centré et quand je veux changer le texte affiché à la création de l'activité, ma tablette me retourne "L'application 'myfirstapplication' s'est arrêtée" dès le lancement de l'application. Eclipse de son côté me retourne une "java.lang.NullPointerException".

    Voici mon code:

    MainActivity.java:

    package com.example.myfisrtapplication;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
      RelativeLayout layout = null;
      TextView text = null;
    
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        layout = (RelativeLayout) RelativeLayout.inflate(this, R.layout.fragment_main, null);
        text = (TextView) layout.findViewById(R.id.hello);
         
        text.setText("hello");
        setContentView(layout);
        
      }
    }

    activity_main.xml:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.myfisrtapplication.MainActivity"
        tools:ignore="MergeRootFrame" >
    
        <TextView
            android:id="@+id/hello"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/hello_world" />
    
    </FrameLayout>
    

    fragment_main.xml:

    <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="com.example.myfisrtapplication.MainActivity$PlaceholderFragment" >
    </RelativeLayout>
    

    Et voici le résultat de LogCat:

    10-28 19:32:38.207: D/jdwp(30480): sendBufferedRequest : len=0x57
    10-28 19:32:38.216: D/dalvikvm(30480): open_cached_dex_file : /data/app/com.example.myfisrtapplication-1.apk /data/dalvik-cache/data@app@com.example.myfisrtapplication-1.apk@classes.dex
    10-28 19:32:38.224: W/SystemTheme/Resources(30480): createSystemThemeIfNeeded
    10-28 19:32:38.224: I/SystemThemeResource(30480): SystemThemeResource: set to default lenovo theme
    10-28 19:32:38.225: D/dalvikvm(30480): create interp thread : stack size=32KB
    10-28 19:32:38.225: D/dalvikvm(30480): create new thread
    10-28 19:32:38.225: D/dalvikvm(30480): new thread created
    10-28 19:32:38.225: D/dalvikvm(30480): update thread list
    10-28 19:32:38.225: D/dalvikvm(30480): threadid=11: interp stack at 0x52b5c000
    10-28 19:32:38.225: D/dalvikvm(30480): threadid=11: created from interp
    10-28 19:32:38.225: D/dalvikvm(30480): start new thread
    10-28 19:32:38.226: D/dalvikvm(30480): threadid=11: notify debugger
    10-28 19:32:38.226: D/dalvikvm(30480): threadid=11 (LaunchIconThemeResource): calling run()
    10-28 19:32:38.233: V/Provider/Settings(30480): invalidate [system]: current 889 != cached 0
    10-28 19:32:38.236: V/Provider/Settings(30480): from db cache, name = lenovo_desktop_theme , value = com.lenovo.launcher.theme.age
    10-28 19:32:38.250: D/AndroidRuntime(30480): Shutting down VM
    10-28 19:32:38.250: W/dalvikvm(30480): threadid=1: thread exiting with uncaught exception (group=0x411aa9a8)
    10-28 19:32:38.252: E/AndroidRuntime(30480): FATAL EXCEPTION: main
    10-28 19:32:38.252: E/AndroidRuntime(30480): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfisrtapplication/com.example.myfisrtapplication.MainActivity}: java.lang.NullPointerException
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.ActivityThread.access$600(ActivityThread.java:156)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.os.Looper.loop(Looper.java:153)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.ActivityThread.main(ActivityThread.java:5299)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at java.lang.reflect.Method.invokeNative(Native Method)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at java.lang.reflect.Method.invoke(Method.java:511)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at dalvik.system.NativeStart.main(Native Method)
    10-28 19:32:38.252: E/AndroidRuntime(30480): Caused by: java.lang.NullPointerException
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at com.example.myfisrtapplication.MainActivity.onCreate(MainActivity.java:20)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.Activity.performCreate(Activity.java:5122)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	... 11 more
    


    Je pense que l'erreur vient de là:

    10-28 19:32:38.252: E/AndroidRuntime(30480): Caused by: java.lang.NullPointerException
    10-28 19:32:38.252: E/AndroidRuntime(30480): 	at com.example.myfisrtapplication.MainActivity.onCreate(MainActivity.java:20)

    Pourtant j'ai beau relire de haut en bas mon code, je ne comprend pas d'où vient l'erreur.

    J'ai cherché toute la journée sur GoogleEstMonAmi :) mais je n'ai rien trouvé corrigeant mon problème.

    J'ai cru comprendre que c'était causé par le fait que j'accède à mon TextView avant qu'il ne soit créé.

    Savez-vous comment résoudre mon problème ?

    Merci d'avance.

    blenderiste09





    • Partager sur Facebook
    • Partager sur Twitter
    Quand le sage désigne la lune, l'idiot regarde le doigt.
      28 octobre 2014 à 20:36:35

      C'est tout à fait normal...

      Le textView se trouve dans le layout "activité_main.xml". Or toi tu inflates le layout " fragment_main.xml" et tu cherches la référence dans de ton textView dans ce layout.

      La référence n'existant pas, ton textView vaut null et tu as l'exception quand tu cherches à lutilser. Si tu inflates le layout "activity_main.XML" tu n'auras plus le soucis.

      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2014 à 20:38:54

        D'ailleurs quand tu es dans une activité, tu n'as pas besoin d'inflzter le layout toi même. Tu peux directement passer l'identifiant du layout à la méthode "setContentView" puis récupérer les références de tes contrôles via la méthode "findViewById".

        • Partager sur Facebook
        • Partager sur Twitter
          28 octobre 2014 à 22:16:23

          Bonjour Wapiti,

          Merci de m avoir repondu. En effet, ton explication est logique. En fait, en cherchant a travers google,  je suis tombe sur une solution qui proposait d inflater le fragment_main plutot que le activity_main mais j ai oublie de remettre comme avant. :p.

          Je n ai pas eclipse sous la main mais des que je l aurais, je testerais ta solution.

          J aurais encore une question. A quoi sert le fragment_main ?

          Merci encore

          blenderiste09

          • Partager sur Facebook
          • Partager sur Twitter
          Quand le sage désigne la lune, l'idiot regarde le doigt.
            29 octobre 2014 à 0:04:53

            Dans. Android, on utilise des Activity et des Fragment.

            Si une activité peut être considéré comme un écran, un fragment peut être considéré comme un sous écran ou partie d'une écran ayant son propre cycle de vie, son propre layout, etc. Un fragment est généralement tenu par une Activity et une Activity peut tenir 0, 1 ou plusieurs Fragments.

            Les Fragments sont notamment utilisés pour gérer correctement des affichages d'écrans différents entre smartphone et tablette tout en pouvant réutiliser le code et ainsi ne pas recoder toute la partie fonctionnelle plusieurs fois.

            Je suppose donc que ton fragment_layout.xml était destiné à un Fragment ;)

            • Partager sur Facebook
            • Partager sur Twitter
              29 octobre 2014 à 11:05:18

              Bonjour Wapiti,

              Merci beaucoup pour ton aide, cela marche à présent !

              Je poste mon code pour ceux qui rencontreraient le même problème:

              package com.example.myfisrtapplication;
              
              import android.app.Activity;
              import android.os.Bundle;
              import android.widget.TextView;
              
              public class MainActivity extends Activity {
                TextView text = null;
              
                @Override
                public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
                  
                  text = (TextView) findViewById(R.id.hello);
                  text.setText("Merci Wapiti89 !");
                }
              }

              Merci encore d'avoir répondu à mes questions !

              blenderiste09

              • Partager sur Facebook
              • Partager sur Twitter
              Quand le sage désigne la lune, l'idiot regarde le doigt.
                29 octobre 2014 à 11:50:29

                Pas de problème. N'oublie pas d'indiquer ton sujet comme résolu ;)

                • Partager sur Facebook
                • Partager sur Twitter

                Cours Android Erreur

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown