Android 工具栏内 SearchView 的数据绑定查询 属性
Android Databinding Query property of SearchView inside Toolbar
我想通过旧式 ViewModel 中的 Android 数据绑定功能更改 SearchView 的查询参数(而不是来自 Google 新架构组件)。 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>
视图模型:
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;
}
};
}
设置查询时需要通知。它会工作
private void setQuery(String query) {
this.query = query;
notifyPropertyChanged(BR.query);
}
我想通过旧式 ViewModel 中的 Android 数据绑定功能更改 SearchView 的查询参数(而不是来自 Google 新架构组件)。 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>
视图模型:
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;
}
};
}
设置查询时需要通知。它会工作
private void setQuery(String query) {
this.query = query;
notifyPropertyChanged(BR.query);
}