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

时间:2013-11-29 15:52:22

标签: android android-support-library searchview android-actionbar-compat android-actionbaractivity

我正在使用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;
                }
            });
        }
}

3 个答案:

答案 0 :(得分:11)

使用MenuItemCompat.setOnActionExpandListener,这是OnActionExpandedListener的后端。

答案 1 :(得分:1)

您可以添加ViewTreeObserver来跟踪android.support.v7.appcompat.R.id.search_edit_frame的可见性状态。您可以在此处查看我的答案:https://stackoverflow.com/a/28762632/1633609

这是我的解决方案的副本来自另一个问题:

我发现MenuItemCompat.setOnActionExpandListener(...)如果您没有通过,则 searchItem .setShowAsAction(MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_ALWAYS); 无效:

android.support.v7.widget.SearchView

但这正在改变SearchView,并用后箭头替换DrawerToggle。

我想保留原始视图并仍然跟踪展开/折叠状态并使用支持的搜索视图。

<强>解决方案:

android.support.v7.appcompat.R.id.search_edit_frame正在更改视图状态时,ID为View.VISIBLE的LinearLayout视图的可见性值正在从View.GONE更改为<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> 且相反。所以我添加了ViewTreeObserver来跟踪搜索编辑框架的可见性变化。

menu_search.xml:

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);
}

在活动中:

{{1}}

答案 2 :(得分:0)

你不能这样做,MenuItem.OnActionExpandListener接口本身也可以从API级别14获得。如果您的问题与搜索有关:http://developer.android.com/guide/topics/search/search-dialog.html