我有一个带有片段的活动以列出一些数据。我已经使用SearchView(操作栏上漂亮的搜索字段)实现了搜索。
搜索正常,用户输入数据,按搜索按钮,结果按预期过滤。
我的问题是我无法将搜索“重置”回所有结果。我已经尝试过在searchManager对象上设置Dismiss和Cancel侦听器,但是永远不会调用onDismiss和oncancel方法。
这是我对清单的操作:
<activity
android:name=".ClientesActivity"
android:label="@string/title_activity_clientes"
android:parentActivityName=".MenuPrincipalActivity"
android:launchMode="singleTop" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="MenuPrincipalActivity" />
<meta-data android:name="android.app.searchable"
android:resource="@xml/cliente_searchable" />
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
ClientesActivity上的方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
clientesService = new ClientesService(getBaseContext());
setContentView(R.layout.activity_clientes);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, ClienteFragment.newInstance(), ClienteFragment.class.getSimpleName())
.commit();
}
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
clientesService.findByNameLike(query);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.clientes, menu);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(true);
return true;
}
它没有显示“侦听器”,因为在无济于事后我撤消了更改。但基本上o在onCreateOptionsMenu方法的“ return true”之前添加了侦听器。一开始没什么花哨的,只是用实现了onDismiss方法的接口重写了一个匿名类,试图在其中放置一些日志,并且从未调用过该方法。
看看android.widget.SearchView#setOnQueryTextFocusChangeListener
。据我所知,hasFocus在显示searchview时将为true,在用户按下向上/向后箭头以关闭搜索之前,不会再次以false调用。奇怪的是,我从没见过android.widget.SearchView#setOnCloseListener
被叫
或者,实现onOptionsItemSelected并调用android.app.Activity#onSearchRequested()来触发搜索对话框,以利用那些注册的回调方法。
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
onSearchRequested();//delegate upstream
break;
default:
return super.onOptionsItemSelected(item);
}
}
Invoking the search dialog文档中不太清楚。我没有在文档中声明它。但是,如果仅使用搜索窗口小部件,则不会触发SearchManager回调。