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

Переменные в XML-ресурсах - передают значения от родителя к дочернему

Я пытаюсь повторно использовать примитивные фигуры и составлять большую часть моего пользовательского интерфейса, используя эти декларативные XML-элементы.

Как сделать переменный атрибут Android?

Но я не хочу создавать отдельный XML файл для каждого значения атрибута и их перестановок и в процессе дублирования большей части работы.

Например, я хотел бы, чтобы потребитель этой формы мог определить значение android: radius?

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
            android:startColor="#449def"
            android:endColor="#2f6699"
            android:angle="270"/>
    <stroke
            android:width="1dp"
            android:color="#2f6699"/>
    <corners
            android:radius="3dp"/>
</shape>

Установить атрибут из потребления родителя XML?

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/shape_box_round_blue_uniform" />
    <!-- How to set the corner radius here? -->
    <item android:drawable="@drawable/shape_box_round_blue" />
</selector>

Решения?

  • Если это вообще возможно, я бы не хотел использовать какой-либо код Java-кода/избежать необходимости создавать пользовательские элементы управления/классы
  • Использование ресурсов измерения может быть плодотворным проспектом?
4b9b3361

Ответ 1

Вы можете создать

атрибуты стиля

я думаю, это то, что вы ищете. Они в основном являются переменными атрибутами. Например. вы можете использовать это в своих theme.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- You can define attributes here -->
    <attr name="button_radius" format="reference" />
</resources>

Определяет ссылку на переменную: button_radius Это можно использовать в стилях или в XML файлах макета:

<!-- You can use them like so: -->
<style name="MyApp.Theme1" parent="android:Theme.Holo.Light">
    <item name="button_radius">12</item>
</style>

<style name="MyApp.Theme2" parent="android:Theme.Holo.Light">
    <item name="button_radius">36</item>
</style>

Таким образом, изменив тему, вы можете использовать разные значения радиуса. Ниже приведен пример UNTESTED, как вы можете изменить свою форму:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:startColor="#449def"
        android:endColor="#2f6699"
        android:angle="270"/>
    <stroke
        android:width="1dp"
        android:color="#2f6699"/>
    <corners
        android:radius="?button_radius"/> <!-- NOTE the ?button_radius-->
</shape>

Пользователи могут просто применять другой стиль для использования разных атрибутов. Я не знаю, отвечает ли этот пример на ваш вопрос, но вы можете многое сделать, объявив атрибуты в своих темах. Эти атрибуты являются динамическими ссылками. Для получения дополнительной информации о возможностях см. Эту статью