java.lang.NullPointerException: vue requise manquante avec l'ID:

11

Android Studio 3.6

dans app / build.gradle:

android {
viewBinding.enabled = true

Voici mon xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/bluetoothBottonMainContainer"
        android:layout_width="0dp"
        android:layout_height="104dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <View
            android:id="@+id/viewPointNotSelect"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:background="@drawable/circle_transparent"
            app:layout_constraintBottom_toBottomOf="@+id/separator"
            app:layout_constraintEnd_toStartOf="@+id/separator"
app:layout_constraintTop_toTopOf="parent" />

et un autre xml l'include prev. xml:

 <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/bottonContainer"
        android:layout_width="0dp"
        android:layout_height="104dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <include
            android:id="@+id/qrBottonContainer"
            layout="@layout/qr_bottom_container"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

ici mon activité:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)
}

l'application est créée et exécutée. Agréable.

Maintenant je déplace id - android:id="@+id/bluetoothBottonMainContainer"

au récipient extérieur comme ceci:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bluetoothBottonMainContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="0dp"
        android:layout_height="104dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <View
            android:id="@+id/viewPointNotSelect"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:background="@drawable/circle_transparent"
            app:layout_constraintBottom_toBottomOf="@+id/separator"
            app:layout_constraintEnd_toStartOf="@+id/separator"
            app:layout_constraintTop_toTopOf="parent" />

l'application est construite, mais lors de l'exécution, j'obtiens une erreur d'exécution dans cette ligne:

binding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater)

Erreur:

10-25 11:11:51.290 E/AndroidRuntime(14128): FATAL EXCEPTION: main
10-25 11:11:51.290 E/AndroidRuntime(14128): Process: com.myproject.debug, PID: 14128
10-25 11:11:51.290 E/AndroidRuntime(14128): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myproject.debug/com.myproject.ui.actviity.QRBluetoothSwipeActivity}: java.lang.NullPointerException: Missing required view with ID: bluetoothBottonMainContainer
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.ActivityThread.-wrap11(ActivityThread.java)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.os.Handler.dispatchMessage(Handler.java:102)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.os.Looper.loop(Looper.java:148)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.ActivityThread.main(ActivityThread.java:5417)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at java.lang.reflect.Method.invoke(Native Method)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
10-25 11:11:51.290 E/AndroidRuntime(14128): Caused by: java.lang.NullPointerException: Missing required view with ID: bluetoothBottonMainContainer
10-25 11:11:51.290 E/AndroidRuntime(14128):     at com.myproject.databinding.BluetoothBottomContainerBinding.bind(BluetoothBottomContainerBinding.java:114)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at com.myproject.databinding.QrBluetoothSwipeActivityBinding.bind(QrBluetoothSwipeActivityBinding.java:76)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at com.myproject.databinding.QrBluetoothSwipeActivityBinding.inflate(QrBluetoothSwipeActivityBinding.java:62)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at com.myproject.databinding.QrBluetoothSwipeActivityBinding.inflate(QrBluetoothSwipeActivityBinding.java:52)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at com.myproject.ui.actviity.QRBluetoothSwipeActivity.onCreate(QRBluetoothSwipeActivity.kt:31)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.Activity.performCreate(Activity.java:6251)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
10-25 11:11:51.290 E/AndroidRuntime(14128):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
10-25 11:11:51.290 E/AndroidRuntime(14128):     ... 9 more
10-25 11:11:51.291 W/ActivityManager(  780):   Force finishing activity com.myproject.debug/com.myproject.ui.actviity.QRBluetoothSwipeActivity
10-25 11:11:51.307 I/Icing   (11529): Indexing done com.google.android.gms-apps
un_abonné
la source
3
Renommer l'identifiant de la vue qui produisait un NPE a fonctionné pour moi. Je suis passé de tiroirLayout à tiroirLayout_main et cela a résolu mon problème.
11m0

Réponses:

9

J'ai rencontré ce problème mais dans mon cas, le problème est le includedrapeau. La solution de contournement que j'ai trouvée consiste à faire en sorte que l'ID de vue soit le même que l'ID de la vue racine de la disposition incluse.

activity_layout.xml

<LinearLayout>
    <include android:id="@+id/widget1" layout="@layout/my_widget" />
</LinearLayout>

my_wideget.xml

<LinearLayout
    android:id="@+id/widget1">
</LinearLayout>
Arst
la source
Cela a fonctionné et c'est fou.
Mercredi
Je ne peux pas croire que cela ait réellement fonctionné.
NepaliDeveloper
Je suis d'accord, c'est stupide. Ma solution était de conserver l'id pour la balise include et de supprimer l'id du niveau supérieur de constraintLayout dans la référence de mise en page pour la balise include.
cking24343
Je ne peux pas croire que définir le même nom fonctionne réellement pour moi.
Jenish
8

Mise à jour

Cela devrait être corrigé dans les dernières versions Beta, Carnary d'Android Studio

Il existe toujours un problème lors de l'utilisation de la liaison de vue avec les éléments de l'onglet de présentation de l'onglet Matériau qui est signalé ici et n'a pas encore été résolu.


Il s'agit d'un bogue dans ViewBinding qui est signalé dans le suivi des problèmes aux endroits suivants.

user158
la source
4
Statut fixe? Bien sûr que non. J'ai toujours ce problème.
Paradoxy
@Paradoxy, cela devrait fonctionner maintenant, mettez à niveau votre studio Android vers la dernière version, car la liaison de vues provient des outils de construction dans Android Studio
user158
2
J'utilise android studio 3.6 depuis le 02/12/2020 et pourtant le problème n'a pas disparu pour certaines de mes activités. J'ai un linearLayout, qui a tabLayout, viewPager, etc. comme fils. Mon tabLayout lui-même a 3 éléments d'onglet. Je reçois la vue requise manquante avec l'ID pour les éléments de l'onglet. Lorsque je supprime leur identifiant, cette erreur disparaît. J'utilise des identifiants simples tels que @ id / tabitem, etc. Cette activité dispose également d'un tiroir avec navigation. En utilisant la liaison de vues, sa bascule disparaît même si j'appelle .setDisplayHomeAsUpEnabled (true). À la fin, j'ai ajouté des outils: viewBindingIgnore = "true" et utilisé ce bon vieux findviewbyid.
Paradoxy
1
@Paradoxy J'ai également rencontré ce problème, il est déjà signalé qui n'est pas résolu.
user158
1
L'erreur m'est toujours venue lors de l'utilisation de la <merge>mise en page pour une vue ajoutée dynamiquement, par exemple: parent_layout.xml-> addView pour l' parent_layout.xmlenfant utilisant MyMergeLayoutBinding.inflate(inflater, viewGroup, false)-> my_merge_layout.xmlutilise <merge>comme balise parent
mochadwi
1

Je rencontre le même bug. Vous pouvez ajouter une vue wrapper dans votre "conteneur externe" pour éviter ce bug.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/bluetoothBottonMainContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="0dp"
        android:layout_height="104dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <View
            android:id="@+id/viewPointNotSelect"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:background="@drawable/circle_transparent"
            app:layout_constraintBottom_toBottomOf="@+id/separator"
            app:layout_constraintEnd_toStartOf="@+id/separator"
            app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

ZX C
la source
Cela ressemble à une solution de contournement
a_subscriber
0

Veuillez vérifier, vous avez peut-être les mêmes fichiers de mise en page dans différents modules.

Maxim Firsoff
la source
0

Dans mon cas, j'ai supprimé l'identifiant à l'intérieur de la mise en page incluse et cela fonctionne correctement!

main.xml

    <RelativeLayout>   
    ....
    <include
        include="@layout/included_layout"   
        android:id="@+id/view_included_layout"/>
    </RelativeLayout>

included_layout.xml

`   <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/top_level_layout">  <!-- Remove this id -->    
        ....
    </LinearLayout>
`

Ma version d'Android Studio est 3.6.2 et la version de build.gradle est 3.6.1

adi
la source