【问题标题】:How to support searchItem.setOnActionExpandListener in API level 8+?如何在 API 级别 8+ 中支持 searchItem.setOnActionExpandListener?
【发布时间】:2013-11-29 15:52:22
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

使用MenuItemCompat.setOnActionExpandListener,它是OnActionExpandedListener的反向端口。

【讨论】:

    【解决方案2】:

    您可以添加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);
    

    但这改变了 SearchView 并用返回箭头替换了 DrawerToggle。

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

    解决方案:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我只想知道searchview什么时候展开,什么时候收起。
      • 正如我在文档中看到的那样,整个扩展都是在 API 级别 14 中引入的
      • 我在寻找 ianhanniballake 的回答。还是谢谢。
      • 是的,我是在我再次评论后才看到的,很棒我没有听说过这个界面:)
      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      相关资源
      最近更新 更多