2016-01-13 121 views
4

我試圖綁定我的視圖的寬度和高度,但我看不到問題在哪裏。Android DataBinding layout_width:您必須提供layout_width attribut

我發現這對this google issue

爲了實現這些爲您的應用程序,創建一個綁定的適配器:

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

所以我創造了我的綁定適配器這樣的:

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

然後嘗試設置我的寬度和高度,如下所示:

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

其中paramsMessage.width是一個public int屬性。

但我得到這個錯誤:

引起:了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) at 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) at android.support.v4.app.FragmentActivity.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.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) 在android.app.ActivityThread.access $ 900(ActivityThread.java:172) 在 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1422) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5832) at java.lang.reflect.Method.invoke(Native Method) at java .lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit。主要(ZygoteInit.java:1194)

我將不勝感激任何幫助,謝謝!

回答

-1

釷結合銜接方法必須是在你的數據傳遞,在你的情況下,代碼必須在此對象的類paramsMessage

+0

我試過但沒有工作:/ – MHogge

+0

不正確,數據和綁定適配器之間沒有連接 – Shirane85

0

我認爲問題不在於數據綁定的類。 layout_widthlayout_height是應該在充氣時間給出的屬性,除非,你會得到這個崩潰。被稱爲的BindingAdapter方法的觀點已經被充氣之後,這是爲時已晚:(

1

這是遲,但任何人誰需要它,我做了以下內容:

我設置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 
    } 
} 
相關問題