Ширина компоновки Kotlin и высота привязки - PullRequest
0 голосов
/ 03 июня 2018

Я гуглил и пробовал примеры, но не могу выполнить привязку ширины и высоты 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 ****

1 Ответ

0 голосов
/ 03 июня 2018

Чтобы привязка данных работала для layout_width и layout_height, необходимо задать ширину и высоту по умолчанию для представления.Поэтому вы можете изменить 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, 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 будет выглядеть так:

@BindingAdapter("android:layout_width")
fun setLayoutWidth(view: View, width: float) {
val layoutParams = view.layoutParams
layoutParams.width = width
view.layoutParams = layoutParams
}

Попробуйте один раз, он должен работать,Дайте мне знать, если это не сработает.

РЕДАКТИРОВАТЬ

Чтобы ваш проект заработал, я добавил эти вещи в build.gradle(Module: app)

1 добавлено apply plugin: 'kotlin-kapt' к плагинам верхнего уровня.

2 добавлено в тег android:

kapt {
    generateStubs = true
}

Послеэти изменения, очистите и перестройте проект перед запуском.

Он будет работать с надеждой. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...