暴露的下拉菜单 - 没有来自 xml 资源的过滤器

Exposed Dropdown Menus - with no filter from xml resource

上下文

当您使用以下对象时:MaterialAutoCompleteTextViewAutoCompleteTextView 您可以指定文本是否过滤结果。您可以使用 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}" />