我用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 ****
答案 0 :(得分:2)
要使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>
你的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
}
完成这些更改后,请在运行之前清理并重建项目。
它有希望。:)