Middle
Jak powiązać niestandardowy widok z niestandardowym układem?
sobes.tech AI
Odpowiedź od AI
Istnieje kilka sposobów:
-
Użycie konstruktora z zestawem atrybutów
AttributeSet: To najczęstszy sposób. W konstruktorze View można odczytać atrybuty z oznaczenia XML i zastosować je.public class MyCustomView extends View { public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); // Odczyt atrybutów z attrs TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView); // Pobranie wartości atrybutów, np.: // int someValue = a.getInt(R.styleable.MyCustomView_someAttribute, defaultValue); a.recycle(); // Ważne jest zwolnienie TypedArray // Inicjalizacja View na podstawie odczytanych atrybutów // ... } // ... inne konstruktory i metody }Przy definiowaniu własnego układu w XML można używać tych atrybutów:
<com.example.app.MyCustomView android:layout_width="wrap_content" android:layout_height="wrap_content" app:someAttribute="someValue" /> -
Inflacja układu wewnątrz View: Jeśli View składa się z kilku innych View, można je inflować z osobnego pliku XML wewnątrz własnej View.
public class MyCompositeView extends LinearLayout { public MyCompositeView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.my_custom_layout, this, true); // Teraz można znaleźć elementy wewnątrz my_custom_layout // TextView myTextView = findViewById(R.id.myTextView); // ... } // ... inne konstruktory i metody }my_custom_layout.xmlmoże wyglądać tak:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/myTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Witaj, własny układ!" /> <!-- inne elementy układu --> </LinearLayout>Następnie ten własny układ
MyCompositeViewjest używany w innym pliku XML:<com.example.app.MyCompositeView android:layout_width="match_parent" android:layout_height="wrap_content" />
Wybór metody zależy od złożoności własnego widoku: dla prostych widoków z minimalną liczbą elementów wystarczy pierwsza metoda, dla złożonych widoków z bardziej rozbudowaną strukturą wewnętrzną lepsza jest druga.