如何将math运算应用于Android维度?
我如何避免这个硬编码的math…
<resources> <dimen name="uno">10dip</dimen> <dimen name="dos">6dip</dimen> <dimen name="uno_plus_dos">16dip</dimen> </resources> <Button android:layout_marginTop="@dimen/uno_plus_dos" />
…并把它转换成这样的东西?
<Button android:layout_marginTop="@dimin/uno + @dimen/dos" />
你不要,对不起。 布局XML文件不支持expression式。 您可以:
- 将其保留为
@dimen/uno_plus_dos
或 - 在Java代码中设置边距,在那里你可以用一堆额外的代码行来代替单个资源
- 编写你自己的布局预处理器来处理像这样的expression式
更新 数据绑定库在其expression式中支持一些操作。 我不确定它是否可以处理这个特定的情况。
一个简单的补充就是使用margin + padding。
使用数据绑定:
android:layout_marginTop="@{@dimen/uno + @dimen/dos}"
IFAIK边距适配器不由sdk提供。 您将需要自己定义它:
@BindingAdapter("android:layout_marginTop") public static void setBottomMargin(View view, int bottomMargin) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, bottomMargin); view.setLayoutParams(layoutParams); }
确保为您的项目启用了数据绑定:
dataBinding { enabled = true }
在你的build.gradle 。
数据绑定文档值得一读。
这里有一些技巧,但不会像你提出的解决scheme那样好,这也是我想要的。 例如,不仅可以在视图(在这种情况下为button)上使用布局填充,也可以在视图的父级(如LinearLayout / RelativeLayout之类的布局)上使用布局填充。 您也可以放入invisibile视图(一个直的View对象经常)与固定的尺寸。 这将是
<View android:layout_width="1px" andoird:layout_height="@dimen/dos" />
请注意,1px是好的,如果要保证只有一个像素将被绘制为一个维度,这通常是你想要的,如果你想使用空填充视图。 有人说FrameLayout更适合用于空填充,但这是View的后代
有时你可以结合填充和布局填充,但是可能会变得杂乱,并且裁剪你的视图。 你也可以像FrameLayout或LinearLayout一样包含该视图,并使用它来添加填充