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 中显示
我尝试了多种解决方案并阅读了一些其他关于 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 中显示