3

我有一个由此 XML 定义的自定义视图

(部分)

<LinearLayout style="@style/LayoutVertWrapContent.SameWidth"
    android:layout_weight="2"
    android:layout_marginRight="?betweenElementsPadding">

    ...
    some inner views
    ...

</LinearLayout>

<LinearLayout style="@style/LayoutVertWrapContent.SameWidth"
    android:layout_weight="2"
    android:layout_marginRight="?betweenElementsPadding">

    ...
    some inner views
    ...

</LinearLayout>

对于这个视图,我声明了一些属性:

<declare-styleable name="TheView">
    ...
    <attr name="betweenElementsPadding" format="dimension" />
</declare-styleable>

如何在布局 xml 中为活动声明此视图并在ElementsPadding之间传递,以便android:layout_marginRight="?betweenElementsPadding"视图的 xml 工作?

<com.blablabla.TheView
        android:id="@+id/date" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"
        dct:betweenElementsPadding="@dimen/background_padding" />

所需的结果是android:layout_marginRight将两个 LinearLayouts 都设置为betweenElementsPadding

更新 1

为了防止进一步的误解,我想有一种统一的方式来改变dct:betweenElementsPadding,比如说

<com.blablabla.TheView
        android:id="@+id/date_1" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"
        dct:betweenElementsPadding="3dp" />

<com.blablabla.TheView
        android:id="@+id/date_2" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"
        dct:betweenElementsPadding="15dp" />

<com.blablabla.TheView
        android:id="@+id/date_3" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"
        dct:betweenElementsPadding="25dp" />

在每种情况下,我都希望将LinearLayout.layout_marginRight设置为dct: betweenElementsPadding 的确切值,即从第一个开始为 3dp、15dp 和 25dp。

更新 2

使用 Joe 部分建议的解决方法。在自定义视图的样式构造函数中,我这样做:

// set betweenElementsPadding
final int betweenElementsPadding = array.getDimensionPixelSize(R.styleable.TheView_betweenElementsPadding, 0);
((LinearLayout.LayoutParams)((LinearLayout)findViewById(R.id.layout_1)).getLayoutParams()).rightMargin = betweenElementsPadding;
((LinearLayout.LayoutParams)((LinearLayout)findViewById(R.id.layout_2)).getLayoutParams()).rightMargin = betweenElementsPadding;

但是我还没有找到关于如何仅对 XML 执行相同操作的原始问题的答案。

4

2 回答 2

0

为什么不使用:

<style name="LayoutVertWrapContent.SameWidth" parent="someOtherStyleIfYouWant">
   <item name="android:layout_marginRight">@dimen/background_padding</item>
   <item name="android:layout_weight">2</item> <!-- if the same in all -->
</style>

没有混合属性?


编辑:

链接可能会有所帮助,而且我认为使用xmlns:dct="http://schemas.android.com/apk/res-auto"将有助于识别dct:betweenElementsPadding您的 xml。

<com.blablabla.TheView
        xmlns:dct="http://schemas.android.com/apk/res-auto"
        android:id="@+id/date" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"
        dct:betweenElementsPadding="@dimen/background_padding" />
于 2013-03-08T10:06:55.350 回答
0

我会推荐dimens.xml。您可以参考这些来执行应用范围内的左/右/上/下填充等操作。您还可以使用 Views/ViewGroups(例如 FrameLayout)进行填充

我认为您也可能意味着将 XML 属性传递给自定义视图。在您的视图的构造函数中,有 attrs 参数,以及用于获取这些属性的命令,例如 gainStyledAttributes

于 2013-03-08T20:59:05.300 回答