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