我想通过旧式ViewModel(而非Google新架构组件)中的Androids数据绑定功能更改SearchView的查询参数。 SearchView位于工具栏中。
在ViewModel
我要调用setQuery(String)
和onSubmit
查询我想用它进行处理。
在当前实现中(请参阅下面的代码部分),SearchViews查询值保持为空。这很清楚,因为字段查询
不会在SearchView.setQuery()
的BindingAdapter附近使用。但我不知道如何从代码中更改其查询值。无法调用BindingAdapter setQuery(SearchView, String)
,因为ViewModel
中没有SearchView,并且不应该为MVVM架构保持清洁。
将SearchView的其他直接可用属性绑定为:QueryHint和queryTextListener可以正常工作。
查询属性不能直接在SearchView
中使用,尽管它有一个setter(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>
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;
}
};
}
答案 0 :(得分:2)
您需要在设置查询时通知。它会工作
private void setQuery(String query) {
this.query = query;
notifyPropertyChanged(BR.query);
}