工具栏中的SearchView的Android数据绑定查询属性

Min*_*sky 6 android searchview android-databinding

我想通过老式的ViewModel(而不是来自Google新的Architecture Components)中的Androids数据绑定功能来更改SearchView的查询参数。SearchView驻留在工具栏中。

ViewModel我要调用setQuery(String)onSubmit查询我想用它来处理。在当前实现中(请参见下面的代码部分),SearchViews查询值保持为空。这很清楚,因为没有在BindingAdapter for附近使用字段查询SearchView.setQuery()。但是我不知道如何从代码更改其查询值。setQuery(SearchView, String)不能调用BindingAdapter ,因为中没有SearchView,因此ViewModel不应为MVVM架构保持其清洁。

绑定SearchView的其他直接可用属性,例如:QueryHint和queryTextListener可以正常工作。尽管查询属性SearchView具有设置器(SearchView.setQuery(String)),但不能直接在中使用。

我能做什么?

XML部分和相应的MainViewModel看起来像这样:

<data>
    <variable
        name="vm"
        type="com.example.MainViewModel"/>
</data>

<android.support.v7.widget.Toolbar
        android:id="@+id/activity_toolbar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginTop="0dp"
        android:background="@color/colorPrimary"
        android:title="@string/app_name"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:subtitleTextColor="@color/white"
        app:title="@string/app_name"
        app:titleTextColor="@color/white" >

<android.support.v7.widget.SearchView
        android:id="@+id/searchView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:iconifiedByDefault="false"
        android:queryHint="@{vm.queryHint}"
        app:iconifiedByDefault="false"
        app:queryTextListener="@{vm.onQueryTextListener}"
        app:query="@{vm.query}" />
</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)

ViewModel:

public class MainViewModel extends BaseObservable {

    private doSomething() {
        setQueryHint("TheHintText")
        setQuery("MyQuery");        
    }

    private void setQueryHint(String queryHint) {
        this.queryHint = queryHint;
        notifyPropertyChanged(BR._all);
    }

    private String query;

    @Bindable
    public String getQuery() {
        return query;
    }

//    private void setQuery(String query) {
//        this.query = query;
//    }

    @BindingAdapter("query")
    public static void setQuery(SearchView searchView, String queryText) {
        searchView.setQuery(queryText, false);
    }

    @Bindable
    public String getQueryHint() {
        return queryHint;
    }

    public SearchView.OnQueryTextListener getOnQueryTextListener() {
        return onQueryTextListener;
    }

    @BindingAdapter("queryTextListener")
    public static void setOnQueryTextListener(SearchView searchView, SearchView.OnQueryTextListener listener) {
        searchView.setOnQueryTextListener(listener);
    }

    private final SearchView.OnQueryTextListener onQueryTextListener = new SearchView.OnQueryTextListener() {
    @Override
        public boolean onQueryTextSubmit(String query) {
            Log.("Test", "query = " + query); // <- query is empty.
        }
    @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    };              
}
Run Code Online (Sandbox Code Playgroud)

Pha*_*inh 2

设置查询时需要通知。它将发挥作用

private void setQuery(String query) {
    this.query = query;
    notifyPropertyChanged(BR.query);
}
Run Code Online (Sandbox Code Playgroud)