Android: menuItem.expandActionView()在API级别<14上

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,甚至是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()相同的功能,而无需牺牲兼容性吗?

3个回答

19

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

MenuItemCompat.expandActionView(mSearchMenuItem);

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


0

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

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

我知道这可能不完全是你要找的,但它可能会帮助你一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接