如何将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一样包含该视图,并使用它来添加填充