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
Arkadiusz Cieśliński

Подивіться на мою відповідь на це пов’язане питання.
Геліос

Відповіді:


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()щоб змінити вигляд відповідно.


7
Просто зауважте про TypedArray. Обов’язково телефонуйте recycle (), коли закінчите з ними.
zskalnik

Тут ви можете знайти хороший список github.com/android/platform_frameworks_base/blob/master/core/…
yahya

Чи IDE (наприклад, затемнення) автоматично заповнює ключі / значення спеціальних атрибутів?
АлікЕльзін-кілака

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, який передається в конструкторі, а "InitiText" - це ваше власне ім'я атрибута
kosiara - Bartosz Kosarzycki

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
Fazal

-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" як параметр мого спеціального елемента інтерфейсу?
Waypoint
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.