Viewのサイズを指定する時に, (A)のサイズと(B)のサイズの和を指定したい場合があります.
AとB, どちらもアプリで定義しているサイズであれば, その和を新たなdimensとして定義することもできますが,
例えば “アクションバーの高さ + 8dp” など, 片方がアプリの管理下にない場合はdimensで定義することができなくなります.
コード上で指定することもできますが, レイアウトの問題はレイアウトXMLで完結させたいところ.
理想としては下記のような指定ができれば良いのですが, Androidではこれができません.
<View
android:paddingTop="?attr/actionBarSize + 8dp" />
そこで, DataBindingの”式”を使えばそれっぽく書くことができます.
<layout>
<data>
<import type="hoge.foo.Dimens"/>
<import type="hoge.foo.Dimens.ActionBar"/>
</data>
<View
android:paddingTop="@{ActionBar.height(context) + Dimens.dpToPx(context, 8)}"
public final class Dimens {
@Px public static int dpToPx(Context c, int dp) {
DisplayMetrics metrics = c.getResources().getDisplayMetrics();
return (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics) + 0.5f);
}
public static class ActionBar {
@Px public static int height(Context c) {
TypedValue tv = new TypedValue();
if (c.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
return TypedValue.complexToDimensionPixelSize(tv.data,
c.getResources().getDisplayMetrics());
}
return 0;
}
}
以上です.