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


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

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

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

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

Thx

3 101

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

в папке 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>

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