У меня есть TextInputLayout
с настраиваемым стилем, который необходимо многократно использовать повторно, поэтому я пытаюсь превратить его в настраиваемый вид.
Вот xml для повторного использования:
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayoutAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
TextInputLayoutAppearance
— это пользовательский стиль, который я создал в styles.xml
Вот класс для моего пользовательского представления:
class OutlinedTextInput @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TextInputLayout(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.view_outlined_textinput, this, true)
}
}
Вот view_outlined_textinput
, который я адаптировал из исходного xml выше для пользовательского представления:
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:parentTag="com.google.android.material.textfield.TextInputLayout">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</merge>
Здесь есть 2 вещи, на которые следует обратить внимание:
Макет использует тег слияния, чтобы избежать избыточного представления в иерархии представлений.
Крайне важно применить пользовательский стиль. Стиль применяется в исходном xml с использованием синтаксиса style=. Однако, поскольку тег слияния используется для пользовательского представления, это невозможно сделать таким образом.
Я попытался установить стиль следующим образом, но это не сработало:
class OutlinedTextInput @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.style.TextInputLayoutAppearance
) : TextInputLayout(context, attrs, defStyleAttr) {
Я предполагаю, что приведенное выше решение должно работать, поскольку третий параметр в конструкторе должен передаваться в стиле.
Другой вариант — установить все свойства программно в init {}
моего пользовательского представления, но это противоречит цели объявления стиля в файле стилей.
Каковы мои варианты?