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

JoJ*_*oJo 47 xml android 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_dos" />
Run Code Online (Sandbox Code Playgroud)

......把它转变成这样的东西?

<Button
 android:layout_marginTop="@dimin/uno + @dimen/dos" />
Run Code Online (Sandbox Code Playgroud)

Com*_*are 30

你没有,抱歉.布局XML文件不支持表达式.你要么:

  • 保留为@dimen/uno_plus_dos,或
  • 在Java代码中设置边距,您可以在其中用一堆额外的代码替换单个资源,或者
  • 编写自己的布局预处理器来处理这样的表达式

UPDATE数据绑定库支持其表达一些操作.我不确定它是否可以处理这种特定情况.

  • 有没有人试图编写自己的(希望是开源)Android布局解析器? (3认同)

mig*_*uel 17

简单添加的一个技巧是使用margin + padding.


Que*_*ier 8

使用数据绑定:

android:layout_marginTop="@{@dimen/uno + @dimen/dos}"
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

确保为您的项目启用了数据绑定:

dataBinding {
    enabled = true
}
Run Code Online (Sandbox Code Playgroud)

在你的build.gradle中.

数据绑定的文档是值得一读.

  • 您是说这是setBottomMargin()方法,因为它的参数和逻辑是针对bottomMargin的吗? (2认同)