То, что я делал в прошлом, это иметь конфигурационный файл по умолчанию, который проверяется в исходном элементе управления. Затем у каждого разработчика есть свой собственный файл конфигурации переопределения, который исключается из исходного управления. Приложение сначала загружает значение по умолчанию, а затем, если файл переопределения присутствует, загружает его и использует любые параметры из переопределения, предпочитая файл по умолчанию.
В общем, чем меньше файл переопределения, тем лучше, но он всегда может содержать больше настроек для разработчика с очень нестандартной средой.
В Руководстве разработчика Android есть раздел под названием Создание пользовательских компонентов . К сожалению, обсуждение атрибутов XML касается только объявления элемента управления внутри файла макета, а не фактической обработки значений внутри инициализации класса. Шаги следующие:
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
, должен быть объявлен. Теги, объявленные в суперклассе, будут доступны в подклассах без повторного объявления.
Поскольку есть два конструктора, которые используют 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
, согласно этой ветке это может измениться в будущем. Это все еще есть в документации, поскольку полезно просматривать все эти константы в одном месте.
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.
TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);
<declare-styleable name="LabelView">
<attr name="text"format="string"/>
<attr name="textColor"format="color"/>
<attr name="textSize"format="dimension"/>
</declare-styleable>
<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 "