java.lang.NullPointerException:缺少 ID 所需的视图:

a_s*_*ber 36 android nullpointerexception android-viewbinding

安卓工作室 3.6

在 app/build.gradle 中:

android {
viewBinding.enabled = true
Run Code Online (Sandbox Code Playgroud)

这是我的 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" />
Run Code Online (Sandbox Code Playgroud)

和另一个 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" />
Run Code Online (Sandbox Code Playgroud)

这是我的活动:

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

该应用程序正在构建和运行。好的。

现在我移动 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" />
Run Code Online (Sandbox Code Playgroud)

应用程序正在构建,但是在运行时我在这一行中收到运行时错误:

binding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater)
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

Ars*_*rst 42

我遇到了这个问题,但就我而言,问题是include标志。我发现的解决方法是使视图 id 与包含的布局的根视图的 id 相同。

activity_layout.xml

<LinearLayout>
    <include android:id="@+id/widget1" layout="@layout/my_widget" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

my_wideget.xml

<LinearLayout
    android:id="@+id/widget1">
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

  • 我同意,这很愚蠢。我的解决方案是保留包含标签的 id 并删除包含标签的布局参考中的constraintLayout顶层的id。 (3认同)
  • 不敢相信设置相同的名称实际上对我有用。 (2认同)

use*_*158 19

更新

这应该在最新的 Beta、Carnary 版本的 Android Studio 中修复

将视图绑定与材料选项卡布局选项卡项一起使用时仍然存在问题,此处报告且尚未修复。


这是 ViewBinding 中的错误,在以下位置的问题跟踪器中报告。

  • 状态固定了?当然不是。我仍然有这个问题。 (20认同)
  • 我从 2020 年 12 月 2 日开始使用 android studio 3.6,但我的一些活动问题并没有消失。我有一个 LinearLayout,它有 tabLayout、viewPager 等作为它的子项。我的 tabLayout 本身有 3 个选项卡项。我得到缺少带有选项卡项目 ID 的必需视图。当我删除他们的 ID 时,这个错误就消失了。我使用简单的 ID,例如 @id/tabitem 等。此 Activity 还具有带导航的抽屉布局。通过使用视图绑定,即使我调用.setDisplayHomeAsUpEnabled(true),它的切换也会消失。最后我添加了工具:viewBindingIgnore =“true”并使用了那个好的旧findviewbyid。 (3认同)
  • 当使用 `&lt;merge&gt;` 布局动态添加视图时,我仍然遇到错误,例如: `parent_layout.xml` -&gt; 使用 `MyMergeLayoutBinding.inflate(inflater, viewGroup, false)` 添加 `parent_layout.xml` 子视图-&gt; `my_merge_layout.xml` 使用 `&lt;merge&gt;` 作为父标签 (3认同)
  • 今天 AS v3.6.1 和 AGP v3.6.1 仍然存在问题。 (2认同)
  • 在 4.0.1(主要版本)中仍然发生在我身上 (2认同)

kap*_*sid 15

如果有人使用TabLayoutViewBinding启用了此功能,那么您可能已经为TabItem. 从TabItemrseolved 中删除 id为我解决了这个问题。

  • 原因在 /sf/answers/4642815271/ 中有解释。 (6认同)
  • 任何其他方式在启用 viewBinding 的 tabitem 上添加 id (2认同)

Big*_*air 13

请注意,如果您<merge>在包含的布局 XML 中使用,则逻辑是不同的,正如这里所指出的:
Exploring Android View Binding in Depth

If we try to give this an ID, the view binding won’t generate the ID in the binding class so we can’t access the view as we did in the case of the normal include.
In this case, we have PlaceholderBinding which is an auto-generated class for placeholder.xml (our <merge> layout file). We have to call its bind() method and pass the root view of the layout in which we included it.

<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>
Run Code Online (Sandbox Code Playgroud)
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
    }
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。救生员。就我而言,它是一个自定义视图,我无法检索它,因为包含布局有一个合并标签。 (4认同)

Max*_*off 12

请检查,也许您在不同的模块中有相同的布局文件。

  • 多谢!问题在于不同功能模块中两个布局的名称相同 (7认同)
  • 我的多模块情况的最佳答案。谢啦 (3认同)
  • 谢谢 !这也是我的问题。即使应用程序甚至没有使用其中一个模块,也会发生这种情况。 (2认同)

小智 10

您应该删除 TabItem id 并使用 TabLayout API 来获取该项目,如果您使用的是 Material Design,则此解决方法有效

检查这个:Github 答案


pau*_*l_f 6

如果您错误地将单元格绑定到 recyclerView 中的视图,您也会收到此错误。如果您将视图绑定到错误的布局,那么您将收到一条错误消息,指出它找不到预期的子视图。

这让我难倒了很长时间。

解决方案是确保您绑定到视图的布局与 ViewBinding 的布局相同。

例如,确保:

R.layout.my_new_view
Run Code Online (Sandbox Code Playgroud)

一定会:

MyNewViewBinding
Run Code Online (Sandbox Code Playgroud)

否则你会得到这个错误。