Подтвердить что ты не робот

Каскадировать значение настраиваемого атрибута из родительского представления в дочернее представление?

Как мне "каскадировать" значение настраиваемого атрибута из родительского представления в его дочернее представление?

Это проще всего объяснить с помощью примера:

<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. Я определил пользовательский атрибут "percent" в attrs.xml с помощью элемента <declare-styleable>. Как вы можете видеть, я установил процент в 35 в XML для CustomLayout.

Теперь я хочу передать то же значение в CustomView (которое расширяет View) и которое я буду включать в CustomLayout. Я не могу найти способ сделать это в XML (это легко сделать в коде, хотя).

Я попробовал следующее:

app:percent="@attr/percent"

app:percent="?attr/percent"

Оба из этих (ожидаемых) неудач с NumberFormatException в TypedArray#getInt().

Итак, любые идеи о том, как заставить это работать?

4b9b3361

Ответ 1

Хотя идея приходит немного поздно, и метод не прямолинейный, я думаю, что он по-прежнему стоит поделиться. Мы можем поместить пользовательские атрибуты в тему, поэтому атрибуты могут быть переданы всем дочерним представлениям из родительского представления, в котором используется тема (т.е. Атрибуты существуют в группе представлений).

Пример следующим образом:

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