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

Как связать пользовательский View с пользовательским Layout?

Sobes Copilot

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

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

sobes.tech AI

Есть несколько способов:

  1. Использование конструктора с набором атрибутов AttributeSet: Это наиболее распространенный способ. В конструкторе View можно прочитать атрибуты из XML-разметки и применить их.

    public class MyCustomView extends View {
    
        public MyCustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // Чтение атрибутов из attrs
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
            // Получение значений атрибутов, например:
            // int someValue = a.getInt(R.styleable.MyCustomView_someAttribute, defaultValue);
            a.recycle(); // Важно освободить TypedArray
    
            // Инициализация View на основе прочитанных атрибутов
            // ...
        }
    
        // ... другие конструкторы и методы
    }
    

    При определении пользовательского Layout в XML, можно использовать эти атрибуты:

    <com.example.app.MyCustomView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:someAttribute="someValue" />
    
  2. Инфлейтинг Layout внутри View: Если View состоит из нескольких других View, их можно инфлейтить из отдельного XML-файла макета внутри пользовательского 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);
            // Теперь можно найти элементы внутри my_custom_layout
            // TextView myTextView = findViewById(R.id.myTextView);
            // ...
        }
    
        // ... другие конструкторы и методы
    }
    

    my_custom_layout.xml может выглядеть так:

    <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="Hello Custom Layout!" />
    
        <!-- другие элементы макета -->
    
    </LinearLayout>
    

    Затем этот пользовательский Layout MyCompositeView используется в другом XML-файле:

    <com.example.app.MyCompositeView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    

Выбор метода зависит от сложности пользовательского View: для простых View с минимальным количеством элементов достаточно первого способа, для составных View с внутренней структурой более подходит второй.