Kotlin布局宽度和高度绑定

时间:2018-06-03 18:01:34

标签: android binding kotlin

我用Google搜索并尝试了示例,但我无法执行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 kotlin文件

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

我尝试了宽度类型的多种排列(将其设置为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 vs type 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 :(得分:2)

要使DataBinding适用于layout_widthlayout_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
}

完成这些更改后,请在运行之前清理并重建项目。

它有希望。:)