9

画面サイズが小さい場合は ImageView を示すブール値をバインドしようとしているため、他のコンポーネント用にさらにスペースが必要な場合は縮小します。そのためにDataBinding Libraryを使用しています。

幅と高さがこのブール値に依存する私のレイアウト:

...
<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属性をオーバーライドする方法を誰かが知っていますか?

4

2 に答える 2

7

デフォルト値を追加する必要があります。つまり、

android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size, default=wrap_content}"
于 2016-12-20T07:45:33.603 に答える
6

質問を書いているうちにわかりました。別の属性を使用して、変更したい属性をバインドしました。コードは次のように終了しました。

<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);
}
于 2016-01-18T20:43:19.007 に答える