【问题标题】:Android XML attribute references another xml attribute of the same typeAndroid XML 属性引用了另一个相同类型的 xml 属性
【发布时间】:2013-03-08 07:59:53
【问题描述】:

我有一个由此 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 做同样事情的原始问题的答案。

【问题讨论】:

    标签: android android-layout android-widget


    【解决方案1】:

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

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

    【讨论】:

    • 你的建议的第一部分我不明白。
    • 至于第二部分,你的意思是我可以在自定义视图的构造函数中解析 attrs 参数并将这些参数代理到底层视图的适当参数吗?比如:final float p = attr.getDimension(R.dimen.TheView_betweenElementsPadding, 0); MyLinearLayout.getLayout().rightMargin = p;?如果你是这个意思,我也考虑过那个,但我想找到一种简单的方法来制作一个 XML 属性来获取另一个 XML 属性的值,只需编辑 XML 而不接触代码。我不敢相信没有办法做到这一点。
    • 对不起。第一部分是我认为这是正常的非自定义视图。在这种情况下,您可以在 dimens.xml 中创建值,以利用“在一处更改它,并且填充更改到该维度值所在的所有位置”。感谢您对第二个帖子的澄清。我想我现在明白你的意思了,比如能够执行“valueOfXMLValue * 2”之类的操作。是的,据我所知,这需要一些 Java 工作
    • 对于 #1: android:layout_marginLeft="@dimen/somePadding" android:layout_marginRight="@dimen/somePadding" 只需修改 dimens.xml 中的 somePadding 就会使这两个值发生变化
    • 关于#1,我昨天想了想,第一次得出了同样的结果,但根本没有解决问题。在我的问题中,您将如何处理上述 UPDATE 之后的部分?抱歉,您的评论甚至没有像我最初想的那样提供解决方法。
    【解决方案2】:

    为什么不使用:

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

    【讨论】:

    • 对不起。那没有帮助。当我在布局 XML 中声明视图时,我希望有一种统一的方式来更改属性。看:&lt;com.blabla.TheView my:betweenElementsPadding="3dp" ... /&gt;.......&lt;com.blabla.TheView my:betweenElementsPadding="15dp" ... /&gt;..... 等,在每种情况下,我只设置 betweenElementsPadding 并且我希望 TheView 的 LinearLayouts 的 layout_marginRigh 更改为该值自动。您建议我为 betweenElementsPadding 的每个新单独值声明一个 stlye
    • 不,那样的话它可能没那么有用......但是如果你只想声明layout_marginRight,我仍然找不到写dct:betweenElementsPadding=sth而不是layout_marginRight=sth的任何用途
    • 请检查上述问题中的更新部分。简而言之,您的方法行不通,因为我想为每个视图声明几个具有不同 layout_marginRight 的自定义视图。考虑到layout_marginRight 不在活动的布局 XML 中,而是在自定义视图的 XML 的深处,我不想触及。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多