49

安卓工作室 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
4

22 回答 22

50

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

activity_layout.xml

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

my_widget.xml

<LinearLayout
    android:id="@+id/widget1">
</LinearLayout>
于 2020-03-15T06:19:53.020 回答
37

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

于 2021-02-06T15:58:50.150 回答
25

请注意,如果您<merge>在包含的布局 XML 中使用,则逻辑会有所不同,如下所示:
Exploring Android View Binding in Depth

如果我们尝试给它一个 ID,视图绑定将不会在绑定类中生成 ID,因此我们无法像在正常包含的情况下那样访问视图。
在这种情况下,我们有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
    }
于 2020-11-16T13:24:36.407 回答
23

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

于 2020-03-17T07:27:11.873 回答
21

更新

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

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


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

于 2019-11-01T12:27:27.193 回答
6

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

这让我难过了很久。

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

例如,确保:

R.layout.my_new_view

一定会:

MyNewViewBinding

否则你会得到这个错误。

于 2020-08-11T02:39:54.567 回答
5

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

检查这个:Github 答案

于 2021-02-15T04:40:54.477 回答
3

解决方案是删除主容器的 id。并放入父级内部的其他容器中。

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>
于 2020-06-25T10:14:23.907 回答
3

就我而言,我删除了包含布局中的 id并且它可以正常工作!

主.xml

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

包含的布局.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

于 2020-04-17T12:49:06.437 回答
1

对我来说,问题是我仍在使用 Android 3.x 版本,但使用的是新的 Gradle 4.0.0 版本。

按“关于->检查更新”,更新了Android Studio,错误不再出现。

于 2020-06-16T11:28:02.360 回答
1

这正在发生在我身上。我只是注意到发生这种情况是因为在我的 xml 文件中可以调用它们:Activity_main.xml / Activity_other.xml 我曾经有一个具有相同 ID 的小部件(在这种情况下为按钮),(+id/bttNext)

(这意味着 activity_main.xml 和 Activity_other 曾经有一个 +id 相同的按钮)

一旦我在设备中测试我的应用程序:

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

出现了

一旦我更改了第二个活动的按钮的 +id(可以说重命名为 bttNext1),aspp 工作正常

总结:避免在按钮(等小部件)中使用相同的 id,如果它们在单独的活动中无关紧要

于 2020-12-17T19:59:24.767 回答
1

我遇到了同样的错误。您可以在“外部容器”中添加包装视图以避免此错误。

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

于 2020-03-06T06:53:03.530 回答
1

只需删除 .gradle 目录并 invlidate 缓存/重新启动项目,保留项目备份。我遇到了同样的问题,用这个方法解决了。

于 2021-02-12T05:34:02.860 回答
0

我的解决方案类似但略有不同,我的对话框中有一个包含

<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" />
于 2020-05-16T04:13:11.813 回答
0

如果您错误地为片段使用 xml 布局但使用不同的布局进行绑定,也会发生此错误。我遇到错误时正在做

class LoginFragment :Fragment(R.layout.login_fragment) { 
private val binding by viewBinding(LoginFragmentNewBinding::bind)//here I am referring to a new xml file called login_fragment_new which is different from the one in the Fragment's constructor (i.e login_fragment)
}

并使用相同的 xml 文件为我修复了它。

于 2021-09-05T07:23:21.817 回答
0

就我而言,另一个模块中有另一个同名的文件。

我在模块 A 中有 item_view.xml,在模块 B 中有 item_view.xml,因此数据绑定无法区分它们。

我更改了其中一个的名称并修复了它。

于 2021-11-11T10:51:07.513 回答
0

Same problem but just in custom view activity I put the correct attributes.

In kotlin:

class CanvasNew @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null):View(context,attrs){

于 2021-08-27T14:57:19.487 回答
0

可能晚了,但是。对于遇到此问题的每个人。我首先尝试了在这里看到的所有东西,但没有运气。我发现使用蛇盒 ID 可以解决问题。我有一个作为 tabContainer 的 ID,它导致了 NPE。将其重命名为 tab_container 为我修复了该错误。

于 2021-08-04T08:21:26.160 回答
0

自定义视图出现了这个问题,错误地取了哪里this而不是super

constructor(context: Context, attrs: AttributeSet?) : this(context,attrs) { //<-Change this to super

}
于 2021-11-05T11:30:26.507 回答
0

getRootView() 返回包含的布局并可以在其中进行更改

于 2020-05-18T07:58:16.113 回答
0

就我而言,我FragmentBinding在方法中使用了不正确的类onCreateView来膨胀布局:

open class InfoFragment : BaseFragment() {

    private val binding by viewBinding(FragmentInfoBinding::bind)
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        // NOTE: using incorrect binding class
        return FragmentEducationBinding.inflate(inflater, container, false).root
    }
    ...
}

为了解决这个问题,我应该在onCreateView方法中使用正确的绑定类,FragmentInfoBinding在我的例子中:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    return FragmentInfoBinding.inflate(inflater, container, false).root
}
于 2022-03-03T14:33:12.717 回答
0

因为我的基地my_main_layout.xml是——

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

  <ScrollView style="@style/ScrollViewContainerStyle">

    <include
        android:id="@+id/include_1"
        layout="@layout/layout"></include>
    
    <include
        android:id="@+id/include_1"
        layout="@layout/layout"></include>
    
    <include
        android:id="@+id/include_1"
        layout="@layout/layout"></include>
    </include></layout>

 </ScrollView>

我的包括layout.xml-

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
    android:id="@+id/tv_title"
    tools:text="This is a tile" />
</LinearLayout>

我刚刚解决了我的问题,用<layout>-

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:visibility="visible">
<TextView
    android:id="@+id/tv_title"
    tools:text="This is a tile" />
</LinearLayout>
</layout>
于 2021-10-10T05:08:57.683 回答