Что такое AttributeSet в Android?
Как я могу использовать его для своего пользовательского представления?
Что такое AttributeSet в Android?
Как я могу использовать его для своего пользовательского представления?
Поздний ответ, хотя и подробное описание, для других.
AttributeSet (Android Docs)
Набор атрибутов, найденных в теге в документе XML.
В основном, если вы пытаетесь создать настраиваемое представление и хотите передавать значения, такие как размеры, цвета и т.д., Вы можете сделать это с помощью AttributeSet
.
Представьте, что вы хотите создать View
как показано ниже.
Там прямоугольник с желтым фоном и круг внутри, пусть пусть 5dp радиус и зеленый фон. Если вы хотите, чтобы ваши представления принимали значения цветов фона и радиуса через XML, например:
<com.anjithsasindran.RectangleView
app:radiusDimen="5dp"
app:rectangleBackground="@color/yellow"
app:circleBackground="@color/green" />
Хорошо, что используется AttributeSet
. У вас может быть этот файл attrs.xml
в папке значений со следующими свойствами.
<declare-styleable name="RectangleViewAttrs">
<attr name="rectangle_background" format="color" />
<attr name="circle_background" format="color" />
<attr name="radius_dimen" format="dimension" />
</declare-styleable>
Поскольку это вид, класс java распространяется из View
public class RectangleView extends View {
public RectangleView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.RectangleViewAttrs);
mRadiusHeight = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_radius_dimen, getDimensionInPixel(50));
mCircleBackgroundColor = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_circle_background, getDimensionInPixel(20));
mRectangleBackgroundColor = attributes.getColor(R.styleable.RectangleViewAttrs_rectangle_background, Color.BLACK);
attributes.recycle()
}
}
Теперь мы можем использовать эти свойства для нашего RectangleView
в вашем макете xml, и мы получим эти значения в конструкторе RectangleView
.
app:radius_dimen
app:circle_background
app:rectangle_background
AttributeSet - это набор свойств, указанных в файле ресурсов xml. Вы не должны делать ничего особенного в своем пользовательском представлении. View(Context context, AttributeSet attrs)
получает вызов для инициализации представления из файла макета. Просто добавьте этот конструктор в свой собственный вид. Ознакомьтесь с примером Пользовательский вид в SDK, чтобы увидеть его использование.
Вы можете использовать AttributeSet для получения дополнительных пользовательских значений для вашего представления, которые вы определяете в xml. Например. Там есть учебник по определению пользовательских атрибутов, который гласит: "Можно читать значения из атрибута напрямую", но он не говорит, как это сделать на самом деле. Однако он предупреждает, что если вы не используете стилизованные атрибуты, тогда:
Если вы хотите игнорировать все стилизованные атрибуты и просто получить атрибуты напрямую:
example.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://www.chooseanything.org">
<com.example.CustomTextView
android:text="Blah blah blah"
custom:myvalue="I like cheese"/>
</LinearLayout>
Обратите внимание, что существуют две строки xmlns (xmlns = пространство имен XML), вторая определяется как xmlns: custom. Затем ниже этого обычая: myvalue определено.
CustomTextView.java
public CustomTextView( Context context, AttributeSet attrs )
{
super( context, attrs );
String sMyValue = attrs.getAttributeValue( "http://www.chooseanything.org", "myvalue" );
// Do something useful with sMyValue
}
Когда представление создается из макета XML, все атрибуты в теге XML считываются из пакета ресурсов и передаются конструктору вида как AttributeSet
Хотя можно напрямую считывать значения из AttributeSet
, у этого есть некоторые недостатки:
Вместо этого передайте AttributeSet
в obtainStyledAttribute()
. Этот метод возвращает массив TypedArray
значений, отложенных и стилизованных.