【问题标题】:ViewBinding: Cannot access '<init>': it is private in 'ActivityMainBinding'ViewBinding:无法访问“<init>”:它在“ActivityMainBinding”中是私有的
【发布时间】:2020-12-12 18:19:19
【问题描述】:

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

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

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,40): 无法访问'':它在'ActivityMainBinding'中是私有的

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,60): 没有为参数“rootView”传递值

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,60): 没有为参数“progressBar”传递值

e: /app/src/main/java/com/adalpari/example/view/MainActivity.kt: (16,60): 没有为参数“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>

最后是在应用的 gradle 中启用 ViewBinding:

apply plugin: 'kotlin-kapt'

android {

    ...

    buildFeatures {
        viewBinding true
    }

    ...
}

非常感谢任何帮助,在此先感谢!

【问题讨论】:

    标签: android android-viewbinding


    【解决方案1】:

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

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

    这在 ViewBinding 的 official docs 中显示

    【讨论】:

      【解决方案2】:

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

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

      apply plugin: 'kotlin-kapt'
      
      android {
      
          ...
      
          buildFeatures {
              dataBinding true
          }
      
          ...
      }
      

      2。将整个布局包裹在&lt;layout&gt; 标签内:

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

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        相关资源
        最近更新 更多