Что такое AttributeSet и как я могу его использовать? - PullRequest
70 голосов
/ 15 марта 2011

Что такое набор атрибутов в Android?

Как я могу использовать его для моего пользовательского просмотра?

Ответы [ 4 ]

19 голосов
/ 31 марта 2016

Поздний ответ, хотя и с подробным описанием, для других.

Набор атрибутов (Документы для Android)

Коллекция атрибутов, обнаруженных в теге XML-документа.

Обычно, если вы пытаетесь создать пользовательский вид и хотите передавать значения, такие как размеры, цвета и т. Д., Вы можете сделать это с помощью AttributeSet.

Вот пример

Представьте, что вы хотите создать View, как показано ниже

enter image description here

Прямоугольник с желтым фоном и круг внутри него, скажем, с радиусом 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>

Поскольку это View, класс 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
6 голосов
/ 18 июля 2014

Вы можете использовать AttributeSet для получения дополнительных пользовательских значений для вашего представления, которые вы определяете в XML.Например.Существует учебное пособие по Определение пользовательских атрибутов , в котором говорится, что «можно считывать значения непосредственно из AttributeSet», но в нем не говорится, как на самом деле это сделать.Однако он предупреждает, что если вы не используете атрибуты styled , то:

  • Ссылки на ресурсы в значениях атрибутов не разрешаются
  • Стили не применяются

Если вы хотите игнорировать все стилизованные атрибуты и просто получить атрибуты напрямую:

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
}
6 голосов
/ 15 марта 2011

AttributeSet - это набор свойств, указанных в файле ресурсов xml. Вы не должны делать ничего особенного в своем пользовательском представлении. View(Context context, AttributeSet attrs) вызывается для инициализации представления из файла макета. Просто добавьте этот конструктор в ваш пользовательский вид. Посмотрите пример Custom View в SDK, чтобы увидеть, как он используется.

0 голосов
/ 28 июля 2017

Когда представление создается из макета XML, все атрибуты в теге XML считываются из пакета ресурсов и передаются конструктору представления в виде AttributeSet

Хотя можно считывать значения непосредственно из AttributeSet, это имеет ряд недостатков:

  • Ссылка на ресурс в значениях атрибута не разрешена
  • Стили не применяются

Вместо этого передайте AttributeSet на obtainStyledAttribute(). Этот метод возвращает обратно массив TypedArray значений, которые были определены и стилизованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...