SearchBox内部的Android数据绑定查询属性

问题描述 投票:4回答:1

我想通过旧式ViewModel(而不是来自Google新架构组件)中的Androids数据绑定功能来更改SearchView的查询参数。 SearchView位于工具栏中。

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

绑定SearchView的其他直接可用属性如:QueryHint和queryTextListener工作正常。查询属性不能直接在ViewModel中使用,尽管它有一个setter(SearchView)。

我能做什么?

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

SearchView.setQuery(String)

ViewModel:

<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>
android searchview android-databinding
1个回答
2
投票

您需要在设置查询时通知。它会工作

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;
        }
    };              
}
© www.soinside.com 2019 - 2024. All rights reserved.