Ответ 1
Если кто-то ищет этот вопрос, через 2 года я попытался сделать то же самое, и теперь я вижу, что он работает нормально.
Я создал файл макета activity_main
в layout
и layout_sw600dp
. Вот расположение под ресурсами layout
:
<layout 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">
<variable
name="small_variable"
type="Integer"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/myRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:id="@+id/small_square"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@android:color/holo_blue_bright"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Это макет в папке layout_sw600dp
:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<variable
name="big_variable"
type="Long"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/myRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:id="@+id/big_square"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@android:color/holo_blue_bright"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
У обоих есть представление, но в каждом есть разные идентификаторы: small_square
и big_square
.
Я запускаю проект на телефоне и таблетки. Вот мои выводы:
- DataBinding создает реализацию, которая содержит ВСЕ представления и переменные во всех файлах макетов с одинаковыми именами в разных папках макетов.
- Представления, существующие во всех макетах, не могут быть обнуляемыми, все остальные обнуляются В приведенных выше XML
myRoot
не является обнуляемым представлением при использовании привязки из Kotlin, в то время какbig_square
иsmall_square
являются обнуляемыми представлениями. Переменные обнуляются независимо от того, существуют ли они во всех макетах (что является ожидаемым поведением). - Вы не можете назвать разные классы привязки в каждом файле. Он должен быть таким же (
MainBinding
в приведенных выше примерах или если вы не определите егоLayoutResourceName
+Binding
по умолчанию). - Имена для представлений и переменных при реализации привязки являются верблюжьим регистром. Так что мой
small_variable
&small_square
былbinding.smallVariable
иbinding.smallSquare
на стороне кода. - С Kotlin вы можете просто использовать представления, такие как
binding.bigSquare?.operation
, и это здорово, что вам не нужно заранее проверять, является ли планшет или телефон или просмотр нулевым или нет. - Просто совет, вы можете назначить поля
binding
, даже если макет, в котором они находятся, не будет использоваться. Вы все еще можете сказатьbinding.smallVariable = 3
в коде, и он выполнит присваивание и сохранит значение. Я думаю, хорошо быть осторожным.