Назад к вопросам
Middle
119
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  1. Определение атрибутов в attrs.xml: Создается файл res/values/attrs.xml (или добавляется в существующий). В нем определяется <declare-styleable> с именем кастомного View и перечисляются <attr> для каждого пользовательского атрибута, указывая их формат (format).

    <?xml version="1.0" encoding="utf-8"?>  
    <resources>  
        <declare-styleable name="MyCustomView">  
            <attr name="customText" format="string"/>  
            <attr name="customColor" format="color"/>  
            <attr name="customEnabled" format="boolean"/>  
        </declare-styleable>  
    </resources>  
    
  2. Использование атрибутов в XML-разметке: В макете XML, где используется кастомный View, добавляются определенные атрибуты, используя пространство имен app.

    <com.example.MyCustomView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        xmlns:app="http://schemas.android.com/apk/res-auto"  
        app:customText="Hello Custom View"  
        app:customColor="@color/colorPrimary"  
        app:customEnabled="true"/>  
    
  3. Чтение атрибутов в коде View: В конструкторе кастомного View (обычно в том, который принимает Context и AttributeSet), используются классы TypedArray и obtainStyledAttributes для чтения значений атрибутов, указанных в XML.

    class MyCustomView @JvmOverloads constructor(  
        context: Context,  
        attrs: AttributeSet? = null,  
        defStyleAttr: Int = 0  
    ) : View(context, attrs, defStyleAttr) {  
    
        // Примеры переменных для хранения значений атрибутов  
        private var customText: String? = null  
        private var customColor: Int = 0  
        private var customEnabled: Boolean = false  
    
        init {  
            // Получение TypedArray с атрибутами  
            val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, 0)  
    
            try {  
                // Чтение значений атрибутов  
                customText = typedArray.getString(R.styleable.MyCustomView_customText)  
                customColor = typedArray.getColor(R.styleable.MyCustomView_customColor, 0) // Добавляем значение по умолчанию  
                customEnabled = typedArray.getBoolean(R.styleable.MyCustomView_customEnabled, false) // Добавляем значение по умолчанию  
    
                // Теперь можно использовать customText, customColor и customEnabled для настройки View  
                // Например:  
                // if (customEnabled) { /* ... */ }  
    
            } finally {  
                // Важно! Переработка TypedArray для освобождения ресурсов  
                typedArray.recycle()  
            }  
        }  
    
        // ... остальная логика View ...  
    }  
    

    Метод obtainStyledAttributes возвращает TypedArray, из которого можно извлечь значения атрибутов по их индексам (генерируются R-классом). После использования необходимо вызвать метод recycle() для освобождения ресурсов.