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

113

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

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

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

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

Спасибо

Точка
источник
Привет, у вас есть хорошая статья о настраиваемых атрибутах в android - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Аркадиуш Цеслинский
Взгляните на мой ответ на этот связанный вопрос.
Helios

Ответы:

258

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

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

uthark
источник
7
Сразу отметим о TypedArray. Обязательно вызовите recycle (), когда закончите с ними.
zskalnik
Здесь вы можете найти хороший список github.com/android/platform_frameworks_base/blob/master/core/…
yahya 04
Заполняет ли IDE (например, eclipse) ключи / значения настраиваемых атрибутов автоматически?
AlikElzin-kilaka
23
для сборок Gradle вы должны использовать http://schemas.android.com/apk/res-autoпри объявлении пользовательского пространства имен
Дори
2
На шаге 3 вы можете просто использовать, String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");где attr - это AttributeSet, который передается в конструктор, а 'initialText' - это имя вашего настраиваемого атрибута
kosiara - Бартош Косажицкий
21

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

Мария Ноймайер
источник
это не ответ, вопрос в том, как программно перейти с java
Фазал
-11

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

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

Франк Ченг
источник
Спасибо за ответ. Но в ресурсе я вижу, что используются значения по умолчанию "android:". Я хочу сказать, могу ли я использовать, например, android: phoneNameSelected = "true" в качестве параметра моего пользовательского элемента пользовательского интерфейса?
Путевая