【问题标题】:Android Databinding Query property of SearchView inside Toolbar工具栏中 SearchView 的 Android 数据绑定查询属性
【发布时间】:2018-04-11 08:13:31
【问题描述】:

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

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

视图模型:

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;
        }
    };              
}

【问题讨论】:

  • @psking ty,好主意。看起来我的情况没有任何内容。看起来我必须编写自己的/扩展 SearchViewBindingAdapter。

标签: android searchview android-databinding


【解决方案1】:

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

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

【讨论】:

  • 好的,谢谢。我必须以某种方式搞砸了,在实验的时候。非常感谢。
猜你喜欢
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多