Sobes.tech
Middle

Jak powiązać niestandardowy widok z niestandardowym układem?

sobes.tech AI

Odpowiedź od AI

Istnieje kilka sposobów:

  1. 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" />
    
  2. 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.xml moż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 MyCompositeView jest 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.