ViewBinding: невозможно получить доступ к '<init>': он является закрытым в 'ActivityMainBinding'

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

Дело в том, что у меня очень простая конфигурация 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>

И, наконец, включение ViewBinding в градации приложения:

apply plugin: 'kotlin-kapt'

android {

    ...

    buildFeatures {
        viewBinding true
    }

    ...
}

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

0
0
4 145
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы рекомендовал использовать dataBinding, который включает в себя 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)
    
Ответ принят как подходящий

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

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

Это показано в официальной документации для ViewBinding.

Другие вопросы по теме