Я гуглил и пробовал примеры, но не могу выполнить привязку ширины и высоты FrameLayout.Другие привязки работают нормально.
Окончательное решение: Пример проекта: https://github.com/jchristof/SimpleDatabindingExample
panel.xml:
<layout>
<data class="PanelControlBinding">
<variable
name="panel"
type="com.example.viewmodels.ContainerViewModel"/>
</data>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@{panel.width}"
android:layout_height="@{panel.height}"
android:translationX="@{panel.left}"
android:translationY="@{panel.top}"
android:background="@{panel.background}"
>
</FrameLayout>
</layout>
binding.kt kotlinfile
@BindingAdapter("android:layout_width")
fun setLayoutWidth(view: View, width: Int) {
val layoutParams = view.layoutParams
layoutParams.width = width
view.layoutParams = layoutParams
}
Я попробовал несколько перестановок типа width (установив его на Float), а также удалил пространство имен android: объявив setLayoutWidth статическим сопутствующим объектом и т. д.
Я продолжаю получать сообщение об ошибке:
Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:layout_width' with parameter type java.lang.Integer on android.widget.FrameLayout.
file:D:\Projects\strandXmlAppRunner\app\src\main\res\layout\panel.xml
loc:9:32 - 9:42
****\ data binding error ****
Как мне нужно изменить эти объявления, чтобы включить привязку к ширине и высоте макета?
Редактировать
также попытался добавить импорт в адаптер привязки:
<data class="PanelControlBinding">
<import type="com.example.services.BindingKt"/>
<variable
name="panel"
type="com.example.viewmodels.ContainerViewModel"/>
</data>
та же ошибка
Редактировать
, возвращаясь к моемуContainerViewModel, я заметил, что если я изменю тип возвращаемой ширины с Int?в Int:
open class ContainerViewModel(val attributes: IValuesStore<String>) {
val width:Int
get() = placementArea?.width?.toInt() ?: 0
}
немного другая ошибка:
Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:layout_width' with parameter type int on android.widget.FrameLayout.
file:D:\Projects\strandXmlAppRunner\app\src\main\res\layout\panel.xml
loc:11:32 - 11:42
****\ data binding error ****
тип java.lang.Integer против типа int
Редактировать
за предложение, изменено для включения значений по умолчанию:
<FrameLayout
android:layout_width="@{panel.width, default=wrap_content}"
android:layout_height="@{panel.height, default=wrap_content}"
android:translationX="@{panel.left}"
android:translationY="@{panel.top}"
android:background="@{panel.background}"
>
</FrameLayout>
и
@BindingAdapter("android:layout_width")
fun setLayoutWidth(view: View, width: Float) {
val layoutParams = view.layoutParams
layoutParams.width = width.toInt()
view.layoutParams = layoutParams
}
без разницы:
Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:layout_width' with parameter type int on android.widget.FrameLayout.
file:D:\Projects\strandXmlAppRunner\app\src\main\res\layout\panel.xml
loc:11:32 - 11:42
****\ data binding error ****