4

いくつかのデータをリストするためのフラグメントを持つアクティビティが 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 メソッドを使用してインターフェイスをオーバーライドする匿名クラスがいくつかのログをそこに配置しようとしただけで、メソッドは呼び出されませんでした。

4

1 に答える 1

0

をご覧くださいandroid.widget.SearchView#setOnQueryTextFocusChangeListener。私が知る限り、searchview が表示されると hasFocus は 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);
       }
    }

検索ダイアログの呼び出しのドキュメントではあまり明確ではありません。ドキュメントで宣言されているとは思いません。しかし、検索ウィジェットだけを使用すると、SearchManager コールバックがトリガーされないようです。

于 2016-04-29T01:05:13.707 に答える