【问题标题】:android searchview setOnActionExpandListener on Honeycomb 3.2android searchview setOnActionExpandListener on Honeycomb 3.2
【发布时间】:2013-11-12 00:06:47
【问题描述】:

我正在使用android-support-v4 开发适用于 Android 3.2 及更高版本的应用。当操作栏中的 SearchView 展开和折叠时,我需要为“拦截”实现OnActionExpandListener。我的 Android 4.0 及更高版本的代码没问题,但 3.2 没有。

menu.xml

<item android:id="@+id/menu_search"
    android:title="@string/menu_search"
    android:icon="@android:drawable/ic_menu_search"
    android:showAsAction="collapseActionView|always"
    android:actionViewClass="android.widget.SearchView" />

MyActivity.java

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

    final MenuItem searchMI = menu.findItem(R.id.menu_search);
    if(searchView == null) {
        //searchView = (SearchView) searchMI.getActionView();
        searchView = (SearchView) MenuItemCompat.getActionView(searchMI);
        searchView.setOnQueryTextListener(this);
        searchView.setOnSuggestionListener(this);
        searchView.setOnCloseListener(new OnCloseListener() {

            @Override
            public boolean onClose() {
                //some code
                return false;
            }
        });
    }


    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion <= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {
        MenuItemCompat.setShowAsAction(searchMI, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
        MenuItemCompat.setOnActionExpandListener(searchMI, new OnActionExpandListener() {

            /* (non-Javadoc)
             * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionExpand(android.view.MenuItem)
             */
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
                return true;
            }

            /* (non-Javadoc)
             * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionCollapse(android.view.MenuItem)
             */
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    } else {
        searchMI.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                Toast.makeText(getApplicationContext(), "MenuItem#onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                Toast.makeText(getApplicationContext(), "MenuItem#onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    }
}

为什么对于 Honeycomb,没有调用监听器的方法?

非常感谢。

【问题讨论】:

  • 只是一个传递说明,因为下面发布了好的答案。有两个问题:(1)应该是“app:showAsAction”,而不是“android:showAsaction”,还有“app:actionViewClass”。 (2) 代码本身应该无条件地使用 MenuItemCompat.setOnActionExpandListener 而不管平台。具有讽刺意味的是,每个到达这里的人都有问题#1;但是OP的代码没有问题#1;它有问题#2。只是说。

标签: java android android-actionbar android-3.0-honeycomb searchview


【解决方案1】:

您可能错过了一个事实(就像我一样)`MenuItemCompat.OnActionExpandListener' 接口具有静态实现,而不是实例方法。

因此,如果您有一个实现 MenuItemCompat.OnActionExpandListener 的类,那么您需要在该类中安装它作为侦听器,如下所示:

MenuItem menuItem =  menu.findItem(R.id.search);
if (menuItem != null) {
  MenuItemCompat.setOnActionExpandListener(menuItem,this);
  MenuItemCompat.setActionView(menuItem, mSearchView);
}

同样的范例适用于 setActionView ...而不是调用 menuItem.setActionView(this),您将 menuItem 作为第一个参数传递给静态版本 MenuItemCompat.setActionView,然后是其他参数。

【讨论】:

  • 嗨,丹..您的解决方案对我有用。非常感谢。你拯救了我的一天。
  • 您的解决方案有效,非常感谢您上面的答案对于正常工作也是必要的“为了使 MenuItemCompat.setOnActionExpandListener 正常工作,您应该在菜单项中添加“collapseActionView”
【解决方案2】:

要使 MenuItemCompat.setOnActionExpandListener 工作,您应该在菜单项中添加“collapseActionView” - 例如 -

<item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          app:showAsAction="ifRoom|collapseActionView"
          app:actionViewClass="android.support.v7.widget.SearchView" />

在 onCreateOptionsMenu 中你可以这样使用它 -

MenuItemCompat.setOnActionExpandListener(menu_search,
            new OnActionExpandListener()
            {
                @Override
                public boolean onMenuItemActionCollapse(MenuItem item)
                {
                    // Do something when collapsed
                    return true; // Return true to collapse action view
                }

                @Override
                public boolean onMenuItemActionExpand(MenuItem item)
                {
                    // Do something when expanded
                    return true; // Return true to expand action view
                }
            });

【讨论】:

    【解决方案3】:

    我发现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);
    }
    

    谢谢!

    【讨论】:

      【解决方案4】:

      你的监听器应该是 MenuItemCompat.OnActionExpandListener() 。

      MenuItemCompat.setOnActionExpandListener(searchItem,
                  new MenuItemCompat.OnActionExpandListener() {
      
      }
      

      【讨论】:

      • 在我的代码中: MenuItemCompat.setOnActionExpandListener(searchMI, new OnActionExpandListener() {...}) OnActionExpandListener 在 MenuItemCompat 类中。您的建议无效。
      • 检查我的答案@critical
      【解决方案5】:

      感谢您的帮助, 你的解决方案对我有用。我想投票给你,但我才意识到我只有一个声望,(;′⌒`)

      实际上,我的解决方案与您的类似,在菜单 xml 文件中只有一个不同,如下所示:

          <item
          android:id="@+id/apps_menu_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/apps_menu_search"
          android:visible="true"
          app:actionViewClass="android.support.v7.widget.SearchView"
          app:showAsAction="ifRoom|collapseActionView" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        相关资源
        最近更新 更多