4

我有一个带有片段的活动来列出一些数据。我已经使用 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 方法的接口,试图在那里放一些日志,但从未调用过该方法。

4

1 回答 1

0

看看android.widget.SearchView#setOnQueryTextFocusChangeListener。据我所知,当显示搜索视图时,hasFocus 将为 true,并且在用户点击 upstack/back 箭头关闭搜索之前不会再次调用 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 回调。

于 2016-04-29T01:05:13.707 回答