Android - пользовательский интерфейс с пользовательскими атрибутами - PullRequest
106 голосов
/ 30 сентября 2011

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

например, элемент myПользовательский элемент:

<com.tryout.myCustomElement
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   android:myCustomValue=<someValue>
/>

Так можно ли определить MyCustomValue ?

Thx

Ответы [ 3 ]

249 голосов
/ 30 сентября 2011

Да. Краткое руководство:

1. Создать атрибут XML

Создайте новый файл XML внутри /res/values/attrs.xml с атрибутом и его типом

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

По сути, вы должны установить один <declare-styleable /> для вашего представления, который содержит все ваши пользовательские атрибуты (здесь только один). Я никогда не находил полный список возможных типов, поэтому я думаю, вам нужно найти источник. Мне известны следующие типы: ссылка (на другой ресурс), цвет, логическое значение, размерность, число с плавающей точкой, целое число и строка Они довольно очевидны

2. Используйте атрибуты в вашем макете

Это работает так же, как вы сделали выше, с одним исключением. Для вашего пользовательского атрибута требуется собственное пространство имен XML.

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.android.com/apk/res/com.example.yourpackage"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   customNS:distanceExample="12dp"
   />

Довольно прямо вперед.

3. Используйте значения, которые вы получили

Измените конструктор вашего пользовательского представления для анализа значений.

public MyCustomElement(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try {
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
    } finally {
        ta.recycle();
    }
    // ...
}

distanceExample - это закрытая переменная-член в этом примере. TypedArray получил много других вещей для анализа других типов значений.

И это все. Используйте проанализированное значение в вашем View, чтобы изменить его, например, используйте его в onDraw(), чтобы соответственно изменить внешний вид.

19 голосов
/ 30 сентября 2011

В папке res / values ​​создайте attr.xml. Там вы можете определить свои атрибуты:

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

Если вы хотите использовать его в файле макета, вы должны добавить

xmlns:customname="http://schemas.android.com/apk/res/your.package.name"

и затем вы можете использовать значение с customname:myCustomValue=""

0 голосов
/ 30 сентября 2011

Да, вы можете. Просто используйте <resource> тег.
вот так:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

ссылка с официального сайта

...