3

我正在使用搜索小部件在我的应用程序上实现搜索界面。我打算支持任何 API 级别 < 11 (Honeycomb)。在搜索活动中,我想覆盖onKeyDown()以在用户按下搜索键时展开搜索小部件,并在提交查询文本时将其最小化。

这很容易通过调用来完成:

@Override
public boolean onSearchRequested() {
    if (mSearchMenuItem != null) {
        mSearchMenuItem.expandActionView();
    }
    return false;
}

并在提交查询时:

searchView.setOnQueryTextListener(new OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            //Do nothing, results for the string supplied are already shown.
            //Just collapse search widget
            mSearchMenu.collapseActionView();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            //do other stuff
             return false;
    });

问题是在 API 级别 14 中引入了折叠和展开。如前所述,我想提供早在 API 级别 11 的支持,但如果不调用新的 API 方法,我无法实现相同的功能。

我试过了:

@Override
public boolean onSearchRequested() {
    searchView.setIconifiedByDefault(false);
    //and also called
    searchView.requestFocusFromTouch();
}

但这根本没有做任何事情(我的意思是如果搜索小部件已经折叠的话,它仍然是折叠的。

由于我保留了对 menuItem 的引用,因此我也尝试了:

@Override
public boolean onSearchRequested() {
    SearchActivity.this.onOptionsItemSelected(mSearchMenuItem);
}

但这也没有做任何事情,我尝试的最后一件事是:

@Override
public boolean onSearchRequested() {
    searchMenu.getActionView().performClick();
    return false;
}

但这也是不行的。

关于我可以做些什么来提供与menuItem.collapseActionView()并且menuItem.expandActionView()不必牺牲兼容性的相同功能的任何想法?

4

3 回答 3

19

这适用于 API 级别 10,用于扩展 ActionView,例如 SearchView

MenuItemCompat.expandActionView(mSearchMenuItem);
于 2014-01-28T10:38:03.073 回答
1

您可以使用 MenuItemCompat 静态方法。例子:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_search, menu);

    MenuItem menuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(menuItem);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
    ...
}

更多信息:http: //developer.android.com/reference/android/support/v4/view/MenuItemCompat.html

于 2013-12-15T16:25:08.207 回答
0

您始终可以选择根据当前运行的版本来区分您的解决方案:

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
// pre honeycomb
} else {
// honeycomb and post
}

我知道这可能不是您正在寻找的东西,但它可能会为您提供一些帮助。

于 2013-02-27T14:56:43.310 回答