如何在API 8+中支持searchItem.setOnActionExpandListener?

4

我正在使用ActionBarActivity,在API级别8+中如何支持searchItem.setOnActionExpandListener?它说最低需要API级别14。

以下是我的代码,目前我正在抑制错误,并仅在API >= 14时允许代码执行。

@SuppressLint("NewApi")
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_bar_home_screen, menu);
    searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat
                .getActionView(searchItem);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            searchItem.setOnActionExpandListener(new OnActionExpandListener() {

                @Override
                public boolean onMenuItemActionExpand(MenuItem item) {
                    hideProgressBar();
                    return true;
                }

                @Override
                public boolean onMenuItemActionCollapse(MenuItem item) {
                    showProgressBar();
                    selectItem(lastSelectedItemPosition);
                    return true;
                }
            });
        }
}

我在这里回答了这个问题:https://dev59.com/oGIj5IYBdhLWcg3wwHpr#28762632 - Sir NIkolay Cesar The First
3个回答

11

1
你可以添加ViewTreeObserver来跟踪android.support.v7.appcompat.R.id.search_edit_frame的可见性状态。你可以在这里查看我的答案: https://dev59.com/oGIj5IYBdhLWcg3wwHpr#28762632 这是我从其他问题中复制的解决方案:

我发现如果你没有传递以下参数,MenuItemCompat.setOnActionExpandListener(...)将不起作用:

    searchItem
            .setShowAsAction(MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
                    | MenuItemCompat.SHOW_AS_ACTION_ALWAYS);

但是这会改变SearchView并用后退箭头替换DrawerToggle。
我想保留原始视图,仍然跟踪扩展/折叠状态并使用支持的Search View。
解决方案:
当android.support.v7.widget.SearchView更改视图状态时,LinearLayout视图(ID为android.support.v7.appcompat.R.id.search_edit_frame)的可见性值从View.VISIBLE更改为View.GONE,反之亦然。因此,我添加了ViewTreeObserver来跟踪搜索编辑框架的可见性变化。

menu_search.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always"/>

</menu>

在这个活动中:
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;

..........

private View mSearchEditFrame;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_search, menu);
    MenuItem searchItem = (MenuItem) menu.findItem(R.id.action_search);

    SearchView searchView = (SearchView) MenuItemCompat
            .getActionView(searchItem);
    searchView.setSubmitButtonEnabled(false);
    mSearchEditFrame = searchView
            .findViewById(android.support.v7.appcompat.R.id.search_edit_frame);

    ViewTreeObserver vto = mSearchEditFrame.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        int oldVisibility = -1;

        @Override
        public void onGlobalLayout() {

            int currentVisibility = mSearchEditFrame.getVisibility();

            if (currentVisibility != oldVisibility) {
                if (currentVisibility == View.VISIBLE) {
                    Log.v(TAG, "EXPANDED");
                } else {
                    Log.v(TAG, "COLLAPSED");
                }

                oldVisibility = currentVisibility;
            }

        }
    });

    return super.onCreateOptionsMenu(menu);
}

0

我只想知道搜索视图何时展开,何时折叠。 - yajnesh
根据文档显示,整个扩展功能是在API级别14中引入的。 - viplezer
我正在寻找ianhanniballake所回答的内容。无论如何,还是谢谢。 - yajnesh
1
是的,我再次评论后看到了它,很棒,我之前没有听说过这个接口 :) - viplezer

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