Подтвердить что ты не робот

Что такое AttributeSet и как я могу его использовать?

Что такое AttributeSet в Android?

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

4b9b3361

Ответ 1

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

AttributeSet (Android Docs)

Набор атрибутов, найденных в теге в документе 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>

Поскольку это вид, класс 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

Ответ 2

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

Ответ 3

Вы можете использовать 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
}

Ответ 4

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

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

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

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