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)
设置查询时需要通知。它将发挥作用
private void setQuery(String query) {
this.query = query;
notifyPropertyChanged(BR.query);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2027 次 |
最近记录: |