Android DataBinding layout_width: you must specify the layout_width attribute

I am trying to relate the width and height of my view, but I do not see where the problem is.

I found this on this google issue

To implement them for your application, create a binding adapter:

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

So, I created my binding adapter as follows:

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...
}

Then try setting my width and height as follows:

<View
        android:layout_width="@{paramsMessage.width}"
        android:layout_height="@{paramsMessage.height}"
... />

Where paramsMessage.width is a public int attribute.

But I get this error:

: java.lang.RuntimeException: XML # 25: layout_width.                                                                                     android.content.res.TypedArray.getLayoutDimension(TypedArray.java:607)                                                                                     android.view.ViewGroup $LayoutParams.setBaseAttributes(ViewGroup.java:6761)                                                                                     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)                                                                                     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(DataBindingUtil.java:116)                                                                                     android.databinding.DataBindingUtil.inflate(DataBindingUtil.java:88)                                                                                     be.standard.appbusiness.tutorials.home.TutorialHomeFragment.onCreateDialog(TutorialHomeFragment.java:35)                                                                                     android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:308)                                                                                     android.support.v4.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.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)                                                                                     android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330)                                                                                     android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)                                                                                     android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1234)                                                                                    at android.app.Activity.performStart(Activity.java:6258)                                                                                     android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2621)                                                                                     android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)                                                                                    at android.app.ActivityThread.access $900 (ActivityThread.java:172)                                                                                     android.app.ActivityThread $H.handleMessage(ActivityThread.java:1422)                                                                                     android.os.Handler.dispatchMessage(Handler.java:102)                                                                                     android.os.Looper.loop(Looper.Java: 145)                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5832)                                                                                     java.lang.reflect.Method.invoke( )                                                                                     java.lang.reflect.Method.invoke(Method.java:372)                                                                                     com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:1399)                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

, !

+4
3

, , , :

layout_width layout_height 0dp .

<ImageView
    android:layout_width="0dp"
    android:layout_height="0dp" />

minWidth/minHeight .

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

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()
    }
}

, .

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
}

<data>, .

class SomeController(val someFragment: SomeFragment){
    fun getDeviceWidthDP(): Float{
        val width = someFragment.context.getDeviceDimensions().first
        return width
    }
}
+2

, . layout_width layout_height - , , . BindingAdapter , , : (

0

Th Methods of the binding adapter should be in the class that you passed as data, in your case the code should be in the class of this paramsMessage object

-1
source

Source: https://habr.com/ru/post/1624140/


All Articles