いくつかのデータをリストするためのフラグメントを持つアクティビティが 1 つあります。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;
}
何も機能しなかった後に変更をロールバックしたため、リスナーは表示されません。ただし、基本的には、onCreateOptionsMenu メソッドの「true を返す」前にリスナーを追加しました。最初は特別なことではありませんでした。実装された onDismiss メソッドを使用してインターフェイスをオーバーライドする匿名クラスがいくつかのログをそこに配置しようとしただけで、メソッドは呼び出されませんでした。