Android - пользовательский интерфейс с пользовательскими атрибутами

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

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

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

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

Спасибо

3 ответа

Решение

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

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() изменить внешний вид соответственно.

В вашей папке 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=""

Да, вы можете. Просто используйте <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>

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

Другие вопросы по тегам