Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Erreur après ConstraintLayout.inflate

textView=null après inflate d'un layout

Sujet résolu
    20 juillet 2019 à 0:34:49

    Bonjour,

    Je débute sous Android Studio, en suivant tranquillement le tuto suivant https://openclassrooms.com/fr/courses/2023346-creez-des-applications-pour-android/2024435-constitution-des-interfaces-graphiques (mais en codant en Kotlin)

    J'en suis au moment où on découvre la fonction inflate, et quand je l'utilise, mon application crash, la raison étant que le textView récupéré depuis findViewByID est null.

    Voici le code :

    package com.example.myfirstapp
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.TextView
    import androidx.constraintlayout.widget.ConstraintLayout
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            ConstraintLayout.inflate(this,R.layout.activity_main,null)
            var txtView=findViewById<TextView>(R.id.textView)
            txtView.text="hi"
            setContentView(R.layout.activity_main)
    
    
        }
    }

    et le XML du layout :

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">
    
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="hello"
                android:padding="100dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                android:id="@+id/textView"/>
    
    </androidx.constraintlayout.widget.ConstraintLayout>


    Pourtant tout fonctionne bien avec le code suivant (seulement un petit setContentView au début, sans inflate) :

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
    setContentView(R.layout.activity_main) var txtView=findViewById<TextView>(R.id.textView) txtView.text="hi" } }

    Voici l'erreur d'exécution :

    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.myfirstapp, PID: 17960
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.MainActivity}: java.lang.IllegalStateException: txtView must not be null
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3260)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396)
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:214)
            at android.app.ActivityThread.main(ActivityThread.java:7319)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)
         Caused by: java.lang.IllegalStateException: txtView must not be null
            at com.example.myfirstapp.MainActivity.onCreate(MainActivity.kt:17)
            at android.app.Activity.performCreate(Activity.java:7783)
            at android.app.Activity.performCreate(Activity.java:7772)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3235)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396) 
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009) 
            at android.os.Handler.dispatchMessage(Handler.java:107) 
            at android.os.Looper.loop(Looper.java:214) 
            at android.app.ActivityThread.main(ActivityThread.java:7319) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934) 
    I/Process: Sending signal. PID: 17960 SIG: 9
    Application terminated.
    


    Je ne trouve absolument pas sur internet d'où pourrait venir l'erreur, et comme je débute complètement, je suis vraiment pommé.

    Merci d'avance pour votre aide !




    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2019 à 18:01:54

      J'ai trouvé l'erreur, il fallait que j'appelle la méthode findViewById sur l'objet Layout créé par la méthode inflate, si j'ai bien compris

      J'ai mal lu le tutoriel, puisque c'était écrit comme cela, erreur de fatigue

      donc le code qui marche :

      override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              val layout=ConstraintLayout.inflate(this,R.layout.activity_main,null) as ConstraintLayout
              var txtView=layout.findViewById<TextView>(R.id.textView)
              txtView.text="hi"
              setContentView(layout)
          }



      • Partager sur Facebook
      • Partager sur Twitter

      [Android] Erreur après ConstraintLayout.inflate

      × 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