Kotlin 布局宽度和高度绑定

jch*_*tof 4 binding android kotlin

我已经用谷歌搜索并尝试了示例,但我无法执行绑定 FrameLayout 宽度和高度。其他绑定工作正常。

最终解决方案: 示例项目:https : //github.com/jchristof/SimpleDatabindingExample

面板.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>
Run Code Online (Sandbox Code Playgroud)

binding.kt kotlin 文件

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

我已经尝试了许多关于宽度类型的排列(将其设置为 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 ****
Run Code Online (Sandbox Code Playgroud)

我需要如何更改这些声明以启用对布局宽度和高度的绑定?

编辑

还尝试向绑定适配器添加导入:

<data class="PanelControlBinding">
    <import type="com.example.services.BindingKt"/>
    <variable
        name="panel"
        type="com.example.viewmodels.ContainerViewModel"/>
</data>
Run Code Online (Sandbox Code Playgroud)

同样的错误

编辑

回到我的 ContainerViewModel,我注意到如果我从 Int 更改宽度的返回类型?到内部:

open class ContainerViewModel(val attributes: IValuesStore<String>) {
    val width:Int
        get() = placementArea?.width?.toInt() ?: 0
}
Run Code Online (Sandbox Code Playgroud)

略有不同的错误:

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 ****
Run Code Online (Sandbox Code Playgroud)

类型 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>
Run Code Online (Sandbox Code Playgroud)

和

@BindingAdapter("android:layout_width")
fun setLayoutWidth(view: View, width: Float) {
    val layoutParams = view.layoutParams
    layoutParams.width = width.toInt()
    view.layoutParams = layoutParams
}
Run Code Online (Sandbox Code Playgroud)

没有区别:

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 ****
Run Code Online (Sandbox Code Playgroud)

kes*_*wal 6

要使 DataBinding 为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>
Run Code Online (Sandbox Code Playgroud)

你的 BindingAdapter 像这样:

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

尝试一次,它应该可以工作。如果它不起作用,请告诉我。

编辑

为了使您的项目工作,我已将这些内容添加到 build.gradle(Module: app)

1添加apply plugin: 'kotlin-kapt'到顶级插件。

2将此添加到android标签:

kapt {
    generateStubs = true
}
Run Code Online (Sandbox Code Playgroud)

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

希望它会起作用。:)