ViewBinding:无法访问“<init>”:它在 'ActivityMainBinding' 中是私有的

ViewBinding: Cannot access '<init>': it is private in 'ActivityMainBinding'

我尝试了多种解决方案并阅读了一些其他关于 class 可见性的答案,但我没有添加任何私有或受保护的修饰符。

关键是,我只有一个非常简单的 ViewBinding 配置,但是当我尝试 运行 它时它显示以下消息。

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,40): Cannot access '': it is private in 'ActivityMainBinding'

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,60): No value passed for parameter 'rootView'

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,60): No value passed for parameter 'progressBar'

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,60): No value passed for parameter 'storiesView'

如您所见,代码非常简单..

主要活动:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    val binding: ActivityMainBinding = ActivityMainBinding()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        onObserve()
    }

    ...

}

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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.MainActivity"
    >

    <com.adalpari.storiesview.view.StoriesView
        android:id="@+id/stories_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/stories_view"
        app:layout_constraintEnd_toEndOf="@+id/stories_view"
        app:layout_constraintStart_toStartOf="@+id/stories_view"
        app:layout_constraintTop_toTopOf="@+id/stories_view"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

最后在应用程序中启用 ViewBinding gradle:

apply plugin: 'kotlin-kapt'

android {

    ...

    buildFeatures {
        viewBinding true
    }

    ...
}

非常感谢任何帮助,提前致谢!

我建议使用 dataBinding,其中包括 viewBinding 和您将来可能需要的其他强大功能。

1.在构建 Gradle 文件中启用 dataBinding

apply plugin: 'kotlin-kapt'

android {

    ...

    buildFeatures {
        dataBinding true
    }

    ...
}

2。将整个布局包裹在 <layout> 标签内:

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

    <LinearLayout
        android:id="@+id/xxx"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        ...

    </LinearLayout>

</layout>

3。设置 Activity/Fragment:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding    //may need rebuild project                 

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)  

        //binding.xxx.xxx
    }
}
  • 对于Fragment:

      binding: FragmentFirstBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_first, container, false)
    

您不应该使用数据绑定的构造函数 类(如您的错误消息所述,它们是私有的)。使用方法 ActivityMainBinding.inflate() 创建绑定对象

binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

这在 ViewBindingofficial docs 中显示