14

如何将自定义属性的值从父视图“级联”到其子视图?

使用示例最容易解释:

<com.example.CustomLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    app:percent="35" >

    <com.example.CustomView
        android:id="@+id/customView1"
        app:percent="how-to-get-app:percent-value-here???"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</com.example.CustomLayout>

在这里,CustomLayout扩展LinearLayout。我在attrs.xml使用<declare-styleable>元素时定义了一个自定义属性“百分比”。如您所见,我在 .xml 的 XML 中将 percent 设置为 35 CustomLayout

我现在想将相同的值传递给CustomView(which extends View) 并且我将包含在CustomLayout. 我无法找到在 XML 中执行此操作的方法(尽管在代码中很容易执行此操作)。

我尝试了以下方法:

app:percent="@attr/percent"

app:percent="?attr/percent"

这两个(预期)都失败了NumberFormatExceptionat TypedArray#getInt()

那么,关于如何让它发挥作用的任何想法?

4

1 回答 1

3

虽然想法来的有点晚,方法也不是直截了当,但我觉得还是值得分享的。我们可以将自定义属性放入主题中,这样可以将属性从使用主题的父视图传递给所有子视图(即属性存在于视图组中)。

示例如下:

<integer name="percentage">35</integer>

<style name="CustomTheme" parent="suitable theme for your case">
    <item name="percent">@integer/percentage</item>
</style>

<com.example.CustomLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:theme="@style/CustomTheme" >

    <com.example.CustomView
        android:id="@+id/customView1"
        app:percent="?attr/percent" <!--Note: that's how it refers to the value,
        however, re-assign the attribute value here is meaningless as attribute percent
        should exist in all child views now. You can retrieve its value via
        Theme.obtainStyledAttributes(R.style.CustomTheme, new int[] {R.attr.percent})
        in every child view-->
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</com.example.CustomLayout>
于 2016-09-23T02:39:00.540 回答