Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML

То, что я делал в прошлом, это иметь конфигурационный файл по умолчанию, который проверяется в исходном элементе управления. Затем у каждого разработчика есть свой собственный файл конфигурации переопределения, который исключается из исходного управления. Приложение сначала загружает значение по умолчанию, а затем, если файл переопределения присутствует, загружает его и использует любые параметры из переопределения, предпочитая файл по умолчанию.

В общем, чем меньше файл переопределения, тем лучше, но он всегда может содержать больше настроек для разработчика с очень нестандартной средой.

463
задан Casebash 23 April 2010 в 01:36
поделиться

1 ответ

В Руководстве разработчика Android есть раздел под названием Создание пользовательских компонентов . К сожалению, обсуждение атрибутов XML касается только объявления элемента управления внутри файла макета, а не фактической обработки значений внутри инициализации класса. Шаги следующие:

1. Объявление атрибутов в values ​​\ attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

Обратите внимание на использование неквалифицированного имени в теге declare-styleable . Тип нестандартных атрибутов Android, таких как extraInformation , должен быть объявлен. Теги, объявленные в суперклассе, будут доступны в подклассах без повторного объявления.

2. Создание конструкторов

Поскольку есть два конструктора, которые используют AttributeSet для инициализации, удобно создать отдельный метод инициализации для вызова конструкторов.

private void init(AttributeSet attrs) { 
    TypedArray a=getContext().obtainStyledAttributes(
         attrs,
         R.styleable.MyCustomView);

    //Use a
    Log.i("test",a.getString(
         R.styleable.MyCustomView_android_text));
    Log.i("test",""+a.getColor(
         R.styleable.MyCustomView_android_textColor, Color.BLACK));
    Log.i("test",a.getString(
         R.styleable.MyCustomView_extraInformation));

    //Don't forget this
    a.recycle();
}

R.styleable.MyCustomView - это автоматически созданный ресурс int [] , где каждый элемент является идентификатором атрибута. Атрибуты создаются для каждого свойства в XML путем добавления имени атрибута к имени элемента. Например, R.styleable.MyCustomView_android_text содержит атрибут android_text для MyCustomView . Затем атрибуты можно получить из TypedArray с помощью различных функций get . Если атрибут не определен в XML, то возвращается null . За исключением, конечно, случаев, когда возвращаемый тип является примитивным, и в этом случае возвращается второй аргумент.

Если вы не хотите получать все атрибуты, можно создать этот массив вручную. Идентификаторы стандартных атрибутов Android включены в android.R.attr , а атрибуты для этого проект находятся в R.attr .

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};

Обратите внимание, что вы не должны использовать что-либо в android.R.styleable , согласно этой ветке это может измениться в будущем. Это все еще есть в документации, поскольку полезно просматривать все эти константы в одном месте.

3. Используйте его в файлах макета, таких как layout \ main.xml

Включите объявление пространства имен xmlns: app = "http://schemas.android.com/apk/res-auto" в элементе xml верхнего уровня. Пространства имен предоставляют способ избежать конфликтов, которые иногда возникают, когда разные схемы используют одни и те же имена элементов (см. эту статью для получения дополнительной информации). URL - это просто способ однозначной идентификации схем - на самом деле ничего не нужно размещать по этому URL . Если похоже, что это ничего не делает, то это потому, что вам на самом деле не нужно добавлять префикс пространства имен, если вам не нужно разрешать конфликт.

<com.mycompany.projectname.MyCustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:text="Test text"
    android:textColor="#FFFFFF"
    app:extraInformation="My extra information"
/> 

Ссылка на настраиваемый вид, используя полное имя.

Образец Android LabelView

Если вам нужен полный пример, посмотрите образец представления ярлыков Android.

LabelView.java

 TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
 CharSequences=a.getString(R.styleable.LabelView_text);

attrs.xml

<declare-styleable name="LabelView">
    <attr name="text"format="string"/>
    <attr name="textColor"format="color"/>
    <attr name="textSize"format="dimension"/>
</declare-styleable>

custom_view_1.xml

<com.example.android.apis.view.LabelView
    android:background="@drawable/blue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    app:text="Blue" app:textSize="20dp"/>

Он содержится в LinearLayout с атрибутом пространства имен: xmlns: app = "http: // схемы. андроид.com / apk / res-auto "

Ссылки

835
ответ дан 22 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: