2017-10-12 18 views
0

@ dimen/somethingを使用できることはわかっていますが、なぜこれがうまくいかず、それを動作させる方法が不思議でした。データバインディングパーサーのブラックボックスを理解するのに役立ちます。 lineralayout要素のための私のXMLでAndroid XMLでdpを使用した3進数でのデータバインディングの幅

android:layout_width="@{DataBoundData.dis.equals(IN_PROGRESS) ? 60dp : 
    (DataBoundData.dis.equals(POSTED) ? 60dp : 0dp)}" 

それは60dpで 'P' のエラーが表示されます。私は60d \ p 60dpといくつかの他のものを試してみました。何もしません。

+0

現時点では3値を忘れています。 'android:layout_width =" @ {60dp} "'は動作しますか? – CommonsWare

+0

@ {60dp}と@ {'60dp'}は動作しません – JPM

+0

したがって、問題は3値ではありません。私の前提は、式言語は単に次元定数を扱わないということです。 – CommonsWare

答えて

2

なぜandroid:layout_width="@{60dp}"が動作しないのかという質問に答えるためには、データバインディングが 'dp'の概念を理解していないからです。

layout_widthは既定ではサポートされていないため、既に属性のBindingAdapterが作成されているか、まったく動作しません。

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

float widthが何であるかをBindingAdapterの兆候はありません:たぶん、あなたはこのような何かを持っています。タイプはないので、その知識をデータバインディングシステムの定数に転送する方法はありません。それはあなたで渡すことができますが、

android:visibility="@{View.INVISIBLE}" 

代わりの

android:visibility="@{invisible}" 

setVisibility()

にint型の値を設定する文脈でinvisible定数何のjavaはありませんを使用しなければならないのと同じ理由であります60のような整数定数を代入します。残念ながら、これらはLayoutParamsのピクセルであり、デバイス間で変化します。

@dimen/someDimensionを使用すると、データバインディングは、値がリソースから抽出された時点でディメンションをフロートに変換します。 Resources.getDimension()floatを返すので、分かりやすいです。同様に、Resources.getColor()は整数を返します。したがって、カラーリソースを渡すたびに整数を渡します。

希望に役立ちます。

+0

フロートを代わりに使用すると分かりますか?ところで、よく置く...あなたの説明、私は何か新しいことを教えるために時間を割いてうれしい! – JPM

+1

はい、動作しますが、ピクセル単位で表示され、dpでは表示されません。プロトタイプ作成には適していますが、実際のアプリケーションには適していません。 –

関連する問題