Я пробовал несколько решений и читал некоторые другие ответы, говорящие о видимости класса, но я не добавлял модификаторы 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
}
...
}
Любая помощь очень ценится, заранее спасибо!
Я бы рекомендовал использовать 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.