Що таке AttributeSet і як я можу ним користуватися?


Відповіді:


25

Пізня відповідь, хоча і детальний опис, для інших.

AttributeSet (Документи Android)

Колекція атрибутів, як знайдено, пов’язану з тегом у документі 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>

Оскільки це 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

2
чому ви вказали цілочисельне значення в getDimensionInPixel(50)?
Daksh Gargas

2
Дякую за гарну відповідь, це може бути легко зрозумілим. Щоб надати цю відповідь, потрібно надати невелику інформацію, яка буде більш корисною. Потім переробіть TypedArray. Що зробить його повторним використанням пізніше абонентом.
Мухаммед Ялчин Куру

@ MuhammedYalçınKuru Гарна порада, я вніс зміни.
capt.swag

9

Ви можете використовувати AttributeSet, щоб отримати додаткові, спеціальні значення для вашого подання, які ви визначаєте в xml. Наприклад. Існує навчальний посібник із визначення користувацьких атрибутів, який стверджує: "можна читати значення з AttributeSet безпосередньо", але там не сказано, як насправді це зробити. Однак попереджає, що якщо ви не використовуєте стилізовані атрибути, тоді:

  • Посилання на ресурси в межах значень атрибутів не вирішені
  • Стилі не застосовуються

Якщо ви хочете проігнорувати всю стилізовану річ атрибутів і просто отримати атрибути безпосередньо:

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

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


1
Не впевнений, що посилання на приклади коли-небудь показували фактичні приклади, але вони завжди переспрямовують на ту саму сторінку. Я завжди роблю посилання на той самий приклад із папки зразків у SDK. Наприклад, наведений вище приклад присутній у цій папціandroid-sdk\samples\android-17\ApiDemos\src\com\example\android\apis\view
Sundeep

0

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

Незважаючи на те, що можна зчитувати значення AttributeSetбезпосередньо, це має деякі недоліки:

  • Посилання на ресурси в межах значень атрибутів не вирішено
  • Стилі не застосовуються

Натомість перейдіть AttributeSetдо obtainStyledAttribute(). Цей метод повертає TypedArrayмасив значень, які були визначені та стилізовані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.