如何将数学运算应用于Android维度?

如何将数学运算应用于Android维度?,android,xml,android-layout,Android,Xml,Android Layout,我如何避免这种硬编码的数学 <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_

我如何避免这种硬编码的数学

<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" />

10度
6dip
16倾角
…然后把它隐藏成这样

<Button
 android:layout_marginTop="@dimin/uno + @dimen/dos" />

对不起,您没有。布局XML文件不支持表达式。你可以:

  • 将其保留为
    @dimen/uno\u plus\u dos
    ,或
  • 在Java代码中设置边距,您可以用一堆额外的代码行替换单个资源,或者
  • 编写自己的布局预处理器,处理如下表达式

更新支持表达式中的某些操作。我不确定它是否能够处理这一具体情况

这方面有一些技巧,但不如您提出的解决方案好,这也是我想要的。例如,不仅可以在视图(本例中为按钮)上使用布局填充,还可以在视图的父级(类似LinearLayout/RelativeLayout的布局)上使用布局填充。您还可以使用固定尺寸放置不可见视图(直视图对象经常工作)。就像

<View
   android:layout_width="1px"
   andoird:layout_height="@dimen/dos" />

请注意,如果希望保证一个标注只绘制1个像素,则1px是可以的,如果希望使用空视图进行填充,这通常是您想要的。有人说FrameLayout更适合用于空填充,但这是从视图中派生出来的


有时,您可以将填充和布局填充组合在一起,但这可能会造成混乱并导致视图被裁剪。此外,您还可以使用框架布局或线性布局之类的内容仅包含该视图,并使用该视图添加填充。

简单添加的一个技巧是使用边距+填充。

使用数据绑定:

android:layout_marginTop="@{@dimen/uno + @dimen/dos}"
sdk不提供IFAIK页边距适配器。您需要自己定义它:

@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


这本书值得一读。

我真希望安卓系统能拥有这一功能。维护2016可能就少了一件事,但仍然没有人尝试编写自己的(希望是开源的)Android布局解析器?您的意思是说这是一个setBottomMargin()方法,因为它的参数和逻辑是用于底边的吗?