暴露的下拉菜单 - 没有来自 xml 资源的过滤器
Exposed Dropdown Menus - with no filter from xml resource
上下文
当您使用以下对象时:MaterialAutoCompleteTextView
或 AutoCompleteTextView
您可以指定文本是否过滤结果。您可以使用 setText(CharSequence text, boolean filter) 方法执行此操作,我引用:
boolean: If false, no filtering will be performed as a result of this
call.
..而且该方法非常有效!
问题
是否可以直接从 xml 做同样的事情? 让我解释一下,使用 data binding 我可以通过android:text
xml 属性。像这样:
<MaterialAutoCompleteTextView
android:text="@{viewmodel.data}" />
因为我没有指定我是否真的想过滤结果的选项,所以它使用默认设置 true..不幸的是我想使用 false。
更多信息
我使用官方文档做了一些研究,但在引用 MaterialAutoCompleteTextView and AutoCompleteTextView 的页面中没有找到任何内容。
您应该能够创建 BindingAdapter
并使用 Databinding
设置这些值,完全没有问题。
例如,您可以创建如下内容:
@BindingAdapter("app:text", "app:filter")
fun MaterialAutoCompleteTextView.updateFilter(text: String, filter: Boolean) {
this.setText(text, filter)
}
然后,在您的 xml 中使用 databinding
作为:
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/autocomplete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:filter="@{ here comes filter value }"
app:text="@{ here comes text value }" />
请记住,我没有 运行 此代码,因此可能存在一些拼写错误问题,但我想您明白了。
另一件需要考虑的事情是在 Kotlin
代码中我使用了一个扩展函数,你可以很容易地改变它并将 MaterialAutoCompleteTextView
作为第一个参数传递。
我是如何实施的:
根据 hardartcore 的回答,我研究了 binding adapter 和他们的最佳实践。在我的模型中 class 我添加了一个方法,该方法已被引用以使用我定义的函数实际绑定数据。
public class Model {
...
@BindingAdapter(value = {"text", "filter"})
public static void setText(MaterialAutoCompleteTextView view, String text, Boolean filter) {
view.setText(text, filter);
}
}
value
指定使用您的函数所需的参数,您也可以使用 requiredAll = false
来告诉您可能会有一些 null
值。在我的例子中,我总是需要两者,所以在 xml:
<com.google.android.material.textfield.MaterialAutoCompleteTextView
...
app:filter="@{false}"
app:text="@{mode.variable}" />
上下文
当您使用以下对象时:MaterialAutoCompleteTextView
或 AutoCompleteTextView
您可以指定文本是否过滤结果。您可以使用 setText(CharSequence text, boolean filter) 方法执行此操作,我引用:
boolean: If false, no filtering will be performed as a result of this call.
..而且该方法非常有效!
问题
是否可以直接从 xml 做同样的事情? 让我解释一下,使用 data binding 我可以通过android:text
xml 属性。像这样:
<MaterialAutoCompleteTextView
android:text="@{viewmodel.data}" />
因为我没有指定我是否真的想过滤结果的选项,所以它使用默认设置 true..不幸的是我想使用 false。
更多信息
我使用官方文档做了一些研究,但在引用 MaterialAutoCompleteTextView and AutoCompleteTextView 的页面中没有找到任何内容。
您应该能够创建 BindingAdapter
并使用 Databinding
设置这些值,完全没有问题。
例如,您可以创建如下内容:
@BindingAdapter("app:text", "app:filter")
fun MaterialAutoCompleteTextView.updateFilter(text: String, filter: Boolean) {
this.setText(text, filter)
}
然后,在您的 xml 中使用 databinding
作为:
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/autocomplete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:filter="@{ here comes filter value }"
app:text="@{ here comes text value }" />
请记住,我没有 运行 此代码,因此可能存在一些拼写错误问题,但我想您明白了。
另一件需要考虑的事情是在 Kotlin
代码中我使用了一个扩展函数,你可以很容易地改变它并将 MaterialAutoCompleteTextView
作为第一个参数传递。
我是如何实施的:
根据 hardartcore 的回答,我研究了 binding adapter 和他们的最佳实践。在我的模型中 class 我添加了一个方法,该方法已被引用以使用我定义的函数实际绑定数据。
public class Model {
...
@BindingAdapter(value = {"text", "filter"})
public static void setText(MaterialAutoCompleteTextView view, String text, Boolean filter) {
view.setText(text, filter);
}
}
value
指定使用您的函数所需的参数,您也可以使用 requiredAll = false
来告诉您可能会有一些 null
值。在我的例子中,我总是需要两者,所以在 xml:
<com.google.android.material.textfield.MaterialAutoCompleteTextView
...
app:filter="@{false}"
app:text="@{mode.variable}" />