2016-01-18 2 views
6

画面サイズが小さい場合はImageViewに示すブール値をバインドしようとしています。私はDataBinding Libraryを使っています。幅と高さがAndroidでデータバインディングを使用してlayout_widthとlayout_heightをバインドする方法

私のレイアウトはすべて、このブール値に依存します。

... 
<data> 
    ... 
    <variable name="smallScreen" type="boolean"/> 
    ... 
</data> 
... 
<ImageView 
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_gravity="center_horizontal" 
android:contentDescription="@{message}" 
android:src="@{image}" 
android:scaleType="center" 
tools:src="@drawable/img_message_private"/> 
... 

私はちょうどこのように私のプロジェクトをビルドしようとした場合、コンパイラはlayout_widthがfloat型を受け入れることができないと言います。十分なフェア、私は次のように、フロートがレイアウト属性の入力を作成するBindingAdapterクラスを使用します。

私のプロジェクトを構築することができます
... 
@BindingAdapter("android:layout_width") 
public static void setLayoutWidth(View view, float width) { 
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.width = (int) width; 
    view.setLayoutParams(layoutParams); 
} 

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

。しかし、レイアウトが最終的にレンダリングされているとき、私は次の例外に該当し、次のよう

java.lang.RuntimeException: Binary XML file line #21: You must supply a layout_width attribute. 

情報だけのために、私の寸法は、DP単位で設定されています

<dimen name="img_small_screen_size">100dp</dimen> 
<dimen name="img_big_screen_size">208dp</dimen> 

誰かができる方法を知っていますlayout_width属性をオーバーライドするので、次元を使用して直接データバインドを使用できますか?

答えて

5

私は自分の質問を書いたので、ちょうどそれを理解しました。私はちょうど私が変更wantedが1をバインドするために別の属性を使用し、コードは次のように終了:

<ImageView 
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_gravity="center_horizontal" 
android:contentDescription="@{message}" 
android:src="@{image}" 
android:scaleType="center" 
tools:src="@drawable/img_message_private"/> 

だから私のBindingAdaptersこのなった:

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

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

「android:layout_width」も使用できます。独自の名前空間を使用する必要はありません。 –

+0

それは本当です、ちょうど私の答え –

+2

を編集しましたあなたの答えは質問と同じに見えます – Bolein95

2

あなたはデフォルト値を追加する必要があり、すなわち、

android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size, default=wrap_content}" 
+0

ありがとう。デフォルト値を設定すると私の問題が解決されます。しかし、私は1つの疑いを持って、デフォルト値は決して実行されません、最初または2番目の値は、なぜデフォルト値を実行しますか? – Shubham

+0

ありがとう!あなたのポストは私にも役立ちました! – Sam

関連する問題