如何在 Material TextInputLayout 中制作自定义 MultiAutoCompleteTextView?
How to make a custom MultiAutoCompleteTextView inside a Material TextInputLayout?
为了底层代码的可重用性和可更新性,我想自定义一个 MultiAutoCompleteTextView
,将其放在 TextInputLayout
中以便使用 Material。
我还没有开始,但我已经遇到了问题。
Graphic demostration of the problem
如你所见,第一个TextInputLayout
是完全错误的。
它们都具有完全相同的结构和属性,唯一不同的是自定义视图。
它基本上是一个扩展 MultiAutoCompleteTextView
.
的空 class
下面是 xml 和自定义视图 class。
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/custom_view"
style="@style/Theme.CustomViews.MorphInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/standard_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed">
<com.scitalys.customViews.ui.main.MorphInputText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/standard_view"
style="@style/Theme.CustomViews.MorphInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/custom_view">
<MultiAutoCompleteTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint" />
</com.google.android.material.textfield.TextInputLayout>
class MorphInputText @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView(context, attrs, defStyleAttr) {
init {
this.threshold = 1
val textWatcher = MorphInputTextWatcher
this.addTextChangedListener(textWatcher)
}
}
更改构造函数中的defStyleAttr
:
class MorphInputText @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = R.attr.autoCompleteTextViewStyle
) : androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView(context, attrs, defStyleAttr){
}
为了底层代码的可重用性和可更新性,我想自定义一个 MultiAutoCompleteTextView
,将其放在 TextInputLayout
中以便使用 Material。
我还没有开始,但我已经遇到了问题。
Graphic demostration of the problem
如你所见,第一个TextInputLayout
是完全错误的。
它们都具有完全相同的结构和属性,唯一不同的是自定义视图。
它基本上是一个扩展 MultiAutoCompleteTextView
.
下面是 xml 和自定义视图 class。
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/custom_view"
style="@style/Theme.CustomViews.MorphInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/standard_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed">
<com.scitalys.customViews.ui.main.MorphInputText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/standard_view"
style="@style/Theme.CustomViews.MorphInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/custom_view">
<MultiAutoCompleteTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint" />
</com.google.android.material.textfield.TextInputLayout>
class MorphInputText @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView(context, attrs, defStyleAttr) {
init {
this.threshold = 1
val textWatcher = MorphInputTextWatcher
this.addTextChangedListener(textWatcher)
}
}
更改构造函数中的defStyleAttr
:
class MorphInputText @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = R.attr.autoCompleteTextViewStyle
) : androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView(context, attrs, defStyleAttr){
}