Android XML属性引用相同类型的另一个xml属性

时间:2013-03-08 07:59:54

标签: android android-layout android-widget

我有一个由此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中为活动声明此视图并传递 betweenElementsPadding ,以便视图的xml中的android:layout_marginRight="?betweenElementsPadding"可以工作?

<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做同样的事情。

2 个答案:

答案 0 :(得分: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>

没有混合属性?


修改

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

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

答案 1 :(得分:0)

我推荐dimens.xml。您可以引用这些来执行应用程序范围的左/右/上/下填充。你也可以使用Views / ViewGroups(例如FrameLayout)来填充

我认为您也可能将XML属性传递给自定义视图。在视图的构造函数中,有attrs参数,以及获取诸如obtainStyledAttributes等属性的命令