Привязка к просмотру: не удается получить доступ к »: он является частным в ‘ActivityMainBinding’

#android #android-viewbinding

#Android #android-привязка к просмотру

Вопрос:

Я пробовал несколько решений и прочитал некоторые другие ответы, в которых говорилось о видимости класса, но я не добавил ни одного частного или защищенного модификатора.

Дело в том, что у меня просто очень простая конфигурация привязки к просмотру, но при попытке ее запуска отображается следующее сообщение.

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’ не передано значение

Код, как вы можете видеть, довольно прост..

MainActivity:

 @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 приложения:

 apply plugin: 'kotlin-kapt'

android {

    ...

    buildFeatures {
        viewBinding true
    }

    ...
}
 

Любая помощь очень ценится, заранее спасибо!

Ответ №1:

Вы не должны использовать конструкторы классов привязки данных (они являются частными, как говорится в вашем сообщении об ошибке). Используйте метод ActivityMainBinding.inflate() для создания объекта привязки

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

Это показано в официальных документах для привязки к просмотру

Ответ №2:

Я бы рекомендовал использовать dataBinding which includes viewBinding и другие мощные функции, которые могут вам понадобиться в будущем.

1. Включить dataBinding в файле сборки Gradle:

 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)