java.lang.NullPointerException: отсутствует необходимое представление с идентификатором:

Android Studio 3.6

в app / build.gradle:

android {
viewBinding.enabled = true

Вот мой 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" />

и еще один xml unclude 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" />

вот моя деятельность:

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

приложение создается и запускается. Отлично.

Теперь я перемещаю id - android:id="@+id/bluetoothBottonMainContainer"

во внешний контейнер следующим образом:

<?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" />

приложение построено, но при запуске я получаю ошибку времени выполнения в этой строке:

binding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater)

ошибка:

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

person a_subscriber    schedule 25.10.2019    source источник
comment
У меня сработало переименование идентификатора представления, которое создавало NPE. Перешел с drawerLayout на drawerLayout_main, и это решило мою проблему.   -  person 11m0    schedule 25.12.2019
comment
Привет, при работе с тегами слияния вам нужно быть особенно осторожными, я написал сообщение в блоге, полностью объясняющее привязку представлений. и почему тег слияния не работает так легко, проверьте ???? Androidbites | ViewBinding   -  person Chetan Gupta    schedule 06.12.2020
comment
@ 11m0, пожалуйста, напишите ответ, чтобы я мог проголосовать за него. Это ЕДИНСТВЕННЫЙ ответ, который сработал для нас!   -  person MidasLefko    schedule 21.02.2021
comment
@ChetanGupta, это потрясающая статья. Спасибо.   -  person Murwa    schedule 03.07.2021


Ответы (15)


Я столкнулся с этой проблемой, но в моем случае проблема связана с флагом include. Обходной путь, который я нашел, - сделать так, чтобы идентификатор представления был таким же, как идентификатор корневого представления включенного макета.

activity_layout.xml

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

my_wideget.xml

<LinearLayout
    android:id="@+id/widget1">
</LinearLayout>
person Arst    schedule 15.03.2020
comment
Согласен, это глупо. Мое решение состояло в том, чтобы сохранить идентификатор для тега include и удалить идентификатор верхнего уровня constraintLayout в справочнике по макету для тега include. - person cking24343; 14.04.2020
comment
Не могу поверить, что установка того же имени действительно сработает для меня. - person Jenish; 18.04.2020
comment
Спасибо! В моем случае я также объявлял другую привязку для включенного макета. Достаточно использовать корневой макет - person Joan; 15.05.2020
comment
Начиная с AGP 4.0 или новее, этого не требуется. - person Jake Wharton; 27.07.2020
comment
Добавление идентификатора в тег ‹/ include /› устранило проблему. AndroidStudio 4.0–4.1 - person Volodymyr R.tmnko; 28.10.2020

Обновить

Это должно быть исправлено в последних бета-версиях и версиях Carnary Android Studio.

По-прежнему существует проблема при использовании привязки просмотра с элементами вкладки макета вкладки материала, о которой сообщается здесь и еще не исправлено.


Это ошибка в ViewBinding, о которой сообщается в системе отслеживания проблем в следующих местах.

person user158    schedule 01.11.2019
comment
Статус исправлен? Конечно, нет. У меня все еще есть эта проблема. - person Paradoxy; 25.02.2020
comment
@Paradoxy, теперь он должен работать, обновите свою студию Android до последней версии, поскольку привязка просмотра происходит из инструментов сборки в Android Studio - person user158; 26.02.2020
comment
Я использую android studio 3.6 от 02.12.2020, и все же проблема не исчезла для некоторых из моих действий. У меня есть linearLayout, у которого есть tabLayout, viewPager и т. Д. В качестве дочерних элементов. Сам мой tabLayout имеет 3 элемента вкладок. Я получаю сообщение Отсутствует необходимое представление с идентификатором для элементов вкладки. Когда я удаляю их идентификатор, эта ошибка исчезает. Я использую простые идентификаторы, такие как @ id / tabitem и т. Д. Это действие также имеет раскладку ящика с навигацией. При использовании привязки просмотра его переключатель исчезает, хотя я вызываю .setDisplayHomeAsUpEnabled (true). В конце я добавил инструменты: viewBindingIgnore = true и использовал старый добрый findviewbyid. - person Paradoxy; 26.02.2020
comment
@Paradoxy Я тоже столкнулся с этой проблемой, она уже сообщалась, которая не исправлена. - person user158; 26.02.2020
comment
Ошибка все еще возникала у меня при использовании макета <merge> для динамически добавляемого представления, например: parent_layout.xml - ›addView для parent_layout.xml дочернего элемента, использующего MyMergeLayoutBinding.inflate(inflater, viewGroup, false) -› my_merge_layout.xml, использует <merge> в качестве родительского тега - person mochadwi; 03.03.2020
comment
вышеуказанные 3 проблемы также пришли мне в голову - person mochadwi; 03.03.2020
comment
По-прежнему существует проблема с AS v3.6.1 и AGP v3.6.1. - person Erik; 03.03.2020
comment
@Erik, ранее упомянутые проблемы, исправлены для меня в канарейке. - person user158; 04.03.2020
comment
не могли бы вы сообщить нам, какая версия канарейки устранена? @ user158 - person mochadwi; 05.03.2020
comment
@mochadwi Я использовал AS 4.0 canary 9, также должен быть исправлен в последних версиях, таких как 4.1 canary 1 - person user158; 05.03.2020
comment
Я получил это, когда у меня было включение, которое относилось к макету только с панелью инструментов в макете в качестве корня. - person Udayaditya Barua; 26.03.2020
comment
По моему опыту, это также произойдет, когда вы попытаетесь смешать простую ViewBinding с макетами DataBinding (если только некоторые из ваших макетов имеют корень layout). - person mkuech; 01.04.2020
comment
Выполнено. Это не работает: Android Studio 3.6.2 - Это работает: Android Studio 4.1 Canary 5 - person zgluis; 14.04.2020
comment
Все еще происходит у меня в 4.0.1 (основной выпуск) - person paul_f; 31.07.2020

Пожалуйста, проверьте, возможно, у вас одинаковые файлы макета в разных модулях.

person Maxim Firsoff    schedule 17.03.2020
comment
Большое спасибо! Проблема заключалась в одном и том же имени двух макетов в разных функциональных модулях. - person P1NG2WIN; 13.12.2020
comment
Лучший ответ для моей ситуации с несколькими модулями. Спасибо чувак - person Ehma Africa; 04.06.2021

Будьте осторожны, если вы используете <merge> внутри своего XML-макета, логика будет другой, как указано здесь:
Подробнее о привязке представления Android

Если мы попытаемся дать этому идентификатор, привязка представления не будет генерировать идентификатор в классе привязки, поэтому мы не сможем получить доступ к представлению, как в случае обычного включения.
В этом случае мы иметь PlaceholderBinding, который является автоматически сгенерированным классом для placeholder.xml (наш <merge> файл макета). Мы должны вызвать его bind() метод и передать корневое представление макета, в который мы его включили.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<include layout="@layout/placeholder" />

</androidx.constraintlayout.widget.ConstraintLayout>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        binding = FragmentOrderBinding.inflate(layoutInflater, container, false)
        placeholderBinding = PlaceholderBinding.bind(binding.root)
        placeholderBinding.tvPlaceholder.text = getString(R.string.please_wait)
        return binding.root
    }
person Big_Chair    schedule 16.11.2020

Если кто-то получает это с включенными TabLayout и ViewBinding, возможно, вы установили идентификатор для TabItem. Удаление идентификатора из TabItem решило для меня проблему.

person kapsid    schedule 06.02.2021

Вы также можете получить эту ошибку, если неправильно привяжете ячейку к представлению в recyclerView. Если вы привяжете представление к неправильному макету, вы получите сообщение об ошибке о том, что оно не может найти ожидаемые дочерние представления.

Это поставило меня в тупик на долгое время.

Решение состоит в том, чтобы убедиться, что макет, который вы привязываете к представлению, совпадает с макетом ViewBinding.

Например, makeure:

R.layout.my_new_view

связан с:

MyNewViewBinding

Или вы получите эту ошибку.

person paul_f    schedule 11.08.2020

В моем случае я удалил идентификатор внутри включенного макета, и он работает правильно!

main.xml

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

include_layout.xml

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

Моя версия Android Studio - 3.6.2, а версия build.gradle - 3.6.1

person adi    schedule 17.04.2020
comment
это тоже работает для меня. оказывается, что идентификатор внутри включенного макета не найден, если мы настроим идентификатор как для тега <include>, так и для используемого родительского макета - person mochadwi; 13.06.2020

Вам следует удалить идентификатор TabItem и использовать API TabLayout для получения элемента, этот способ обхода работает, если вы используете Material Design.

проверьте это: ответ Github

person Jorge Aldana    schedule 15.02.2021

Решение - удалить идентификатор основного контейнера. И поместите в другой контейнер внутри родителя.

1.- Макет

    <include
    android:id="@+id/example"
    layout="@layout/account_current_payment_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
    

2.- Включить макет

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/example2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent">
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
person David Arribas    schedule 25.06.2020

Я встречаю ту же ошибку. Вы можете добавить представление оболочки в свой «внешний контейнер», чтобы избежать этой ошибки.

<?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>

person ZX C    schedule 06.03.2020

Для меня проблема заключалась в том, что я все еще использовал версию Android 3.x, но использовал новую версию Gradle 4.0.0.

Нажал «О программе-> Проверить обновления», обновил Android Studio, и ошибки больше нет.

person Starwave    schedule 16.06.2020

Это происходит со мной прямо сейчас. Я просто заметил, что это произошло потому, что в моих файлах xml их можно вызывать: Activity_main.xml / Activity_other.xml. У меня был виджет (в данном случае кнопка) с тем же идентификатором (+ id / bttNext)

(это означает, что у activity_main.xml и Activity_other раньше была кнопка с одинаковым + id)

как только я тестирую свое приложение на устройстве, я:

java.lang.NullPointerException: отсутствует необходимое представление с идентификатором:

появился

как только я изменил кнопку + id второй активности (скажем, переименовал bttNext1) aspp работал нормально

Подведем итоги: избегайте использования одного и того же идентификатора в кнопках (и других виджетах), не имеет значения, если они находятся в разных действиях

person MarkT    schedule 17.12.2020

просто удалите каталог .gradle и активируйте кеши / перезапустите проект, сохраните резервную копию проекта. Я столкнулся с той же проблемой, решенной этим методом.

person jayu pipaliya    schedule 12.02.2021

Мое решение было похожим, но немного другим, у меня было включение в мой диалог

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:minHeight="@dimen/complete_programme_min_height"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<include
    android:id="@+id/include" <!-- Removing this line worked -->
    layout="@layout/background_triangle_medium_violet_gradient" />
person juliusspencer    schedule 16.05.2020
comment
вы не можете получить дочерний вид без идентификатора - person Euphor08; 29.01.2021

getRootView () возвращает включенный макет и может вносить в него изменения

person Ananthu Subramanian    schedule 18.05.2020