Android DataBinding layout_width:您必须提供layout_width属性

MHo*_*gge 7 android width android-layout android-databinding

我试图绑定我的视图的宽度和高度,但我看不出问题出在哪里.

我发现这个谷歌问题

要为您的应用程序实现这些,请创建绑定适配器:

@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, int width) {
  LayoutParams layoutParams = view.getLayoutParams();
  layoutParams.width = width;
  view.setLayoutParams(layoutParams);
}
Run Code Online (Sandbox Code Playgroud)

所以我创建了我的绑定适配器,如下所示:

public class SimpleBindingAdapter {

    @BindingAdapter("android:layout_width")
    public static void setLayoutWidth(View view, int width) {
        ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
        layoutParams.width = width;
        view.setLayoutParams(layoutParams);
    }

    @BindingAdapter("android:layout_height")
    public static void setLayoutHeight(View view, int height) {
        ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
        layoutParams.height = height;
        view.setLayoutParams(layoutParams);
    }

    //Others methods...
}
Run Code Online (Sandbox Code Playgroud)

然后尝试设置我的宽度和高度,如下所示:

<View
        android:layout_width="@{paramsMessage.width}"
        android:layout_height="@{paramsMessage.height}"
... />
Run Code Online (Sandbox Code Playgroud)

其中paramsMessage.width是一个public int属性.

但我得到这个错误:

引起:java.lang.RuntimeException:二进制XML文件行#25:您必须提供layout_width属性.在android.view.View.View的View.Avray.View.View.St上的android.content.res.TypedArray.getLayoutDimension(TypedArray.java:607)以及android.view.ViewGroup $ $ MarginLayoutParams.(ViewGroup.java:6930)在android.widget.RelativeLayout $ LayoutParams.(RelativeLayout.java:1244)android.widget.RelativeLayout.generateLayoutParams(RelativeLayout.java:1084)android.widget.RelativeLayout.generateLayoutParams(RelativeLayout.java:83)at android.view .LayoutInflater.rInflate(LayoutInflater.java:820)位于android.view.LayoutInflater.inflate(LayoutInflater.java:511)的android.view.LayoutInflater.inflate(LayoutInflater.java:415),位于android.databinding.DataBindingUtil.inflate(位于android.support.v4.app的be.standard.appbusiness.tutorials.home.TutorialHomeFragment.onCreateDialog(TutorialHomeFragment.java:35)的android.databing.DataBindingUtil.inflate(DataBindingUtil.java:88)中的DataBindingUtil.java:116) android.upport.v上的.DialogFragment.getLayoutInflater(DialogFragment.java:308)4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)位于android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)的android.support.v4.app.BackStackRecord.run(BackStackRecord.java: 738)在Android.support.v4.app.FragmentActivity的android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330) .onStart(FragmentActivity.java:547)在android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1234)的android.app.Activity.performStart(Activity.java:6258)android.app.ActivityThread.performLaunchActivity(ActivityThread. java:2621)在android.app.A活动时,我在Android.app.ActivityThread.access $ 900(ActivityThread.java:172)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)处于android.app.ActivityThread $ H.handleMessage(ActivityThread.java: 1422)在android.os.Handler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Loope)r.java:145)在java.lang.reflect.Method.invoke的java.lang.reflect.Method.invoke(Native Method)的android.app.ActivityThread.main(ActivityThread.java:5832)上(Method.java: 372)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

  谢谢你们,我将不胜感激!

Die*_*nci 5

这已经很晚了,但对于需要它的人,我做了以下事情:

我在视图中将 layout_width 和 layout_height 设置为 0dp。

<ImageView
    android:layout_width="0dp"
    android:layout_height="0dp" />
Run Code Online (Sandbox Code Playgroud)

您可以将 minWidth / minHeight 与数据绑定一起使用,或者创建您自己的属性以通过绑定设置宽度和高度。

<ImageView
     android:layout_width="0dp"
     android:layout_height="0dp"
     android:minWidth="@{controller.getDeviceWidthDP()}"
     android:minHeight="@{controller.getDeviceWidthDP()}" />
Run Code Online (Sandbox Code Playgroud)

为每个属性创建 BindingAdapter,这里我使用 Kotlin。

object ViewBindings{
    @JvmStatic
    @BindingAdapter("android:minWidth")
    fun setLayoutWidth(view: View, width: Float) {
        val layoutParams = view.layoutParams
        layoutParams.width = (width * view.resources.displayMetrics.density).toInt()
        view.layoutParams = layoutParams
        view.invalidate()
    }

    @JvmStatic
    @BindingAdapter("android:minHeight")
    fun setLayoutHeight(view: View, height: Float) {
        val layoutParams = view.layoutParams
        layoutParams.height = (height * view.resources.displayMetrics.density).toInt()
        view.layoutParams = layoutParams
        view.invalidate()
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我使用了一个扩展函数来获取设备的宽度和高度尺寸。

fun Context.getDeviceDimensions(): Pair<Float, Float> {
    var widthHeight = Pair(0.0F, 0.0F)
    resources.displayMetrics.let {
        val dpHeight = it.heightPixels / it.density
        val dpWidth = it.widthPixels / it.density
        widthHeight = Pair(dpWidth, dpHeight)
    }

    return widthHeight
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个控制器类并使用<data>标签将它包含在我的布局中。

class SomeController(val someFragment: SomeFragment){
    fun getDeviceWidthDP(): Float{
        val width = someFragment.context.getDeviceDimensions().first
        return width
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 -2

绑定适配器方法必须位于您作为数据传递的类中,在您的情况下,代码必须位于该对象 paramsMessage 的类中