Middle
Jak dodać niestandardowe atrybuty do niestandardowego widoku w Android?
sobes.tech AI
Odpowiedź od AI
-
Definicja atrybutów w
attrs.xml: Tworzy się plikres/values/attrs.xml(lub dodaje do istniejącego). W nim definiuje się<declare-styleable>z nazwą niestandardowego widoku i wymienia<attr>dla każdego niestandardowego atrybutu, wskazując ich format (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> -
Użycie atrybutów w XML layout: W układzie XML, gdzie używany jest niestandardowy widok, dodaje się określone atrybuty, korzystając z przestrzeni nazw
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="Witaj Niestandardowy Widok" app:customColor="@color/colorPrimary" app:customEnabled="true"/> -
Odczyt atrybutów w kodzie widoku: W konstruktorze niestandardowego widoku (zwykle przyjmującym
ContextiAttributeSet) używa się klasTypedArrayiobtainStyledAttributes, aby odczytać wartości atrybutów określonych w XML.class MyCustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr) { // Zmienne do przechowywania wartości atrybutów private var customText: String? = null private var customColor: Int = 0 private var customEnabled: Boolean = false init { // Pobranie TypedArray z atrybutami val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, 0) try { // Odczyt wartości atrybutów customText = typedArray.getString(R.styleable.MyCustomView_customText) customColor = typedArray.getColor(R.styleable.MyCustomView_customColor, 0) // Domyślna wartość customEnabled = typedArray.getBoolean(R.styleable.MyCustomView_customEnabled, false) // Domyślna wartość // Teraz można używać customText, customColor i customEnabled do konfiguracji widoku // Na przykład: // if (customEnabled) { /* ... */ } } finally { // Ważne! Zwolnienie zasobów przez wywołanie recycle() typedArray.recycle() } } // ... reszta logiki widoku ... }