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

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

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

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

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

спасибо

Ответ 1

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

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 /> для вашего представления, который содержит все ваши пользовательские атрибуты (здесь только один). Я не нашел полный список возможных типов, поэтому вам нужно посмотреть на источник, который я предполагаю. Типы, которые я знаю, являются ссылкой (на другой ресурс), цветом, булевым, размерным, float, integer и string. Они довольно понятны

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

Ответ 2

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

Ответ 3

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

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