MenuItemCompat.setOnActionExpandListener没有任何作用

10

背景

我使用一个自己制作的特殊类初始化了一个搜索视图,该视图在所有活动和片段中都被使用。

问题

最近,可能由于支持库的更新(或者因为我以前没有使用它,我不记得了),我无法捕获搜索视图的展开/折叠事件。

我发现,即使我使用Toolbar实例和setSupportActionBar,这也会发生。

我的尝试

我尝试了下面每种方法,但是都没有成功:

  • MenuItemCompat.setOnActionExpandListener。
  • MenuItemCompat.setOnActionExpandListener与将SearchView设置为图标,正如一些网站建议的那样。
  • 在搜索菜单项本身上使用setOnActionExpandListener,但由于扩展ActionBarActivity时无法使用,因此会崩溃。
  • SearchView.setOnCloseListener ,但仅在我关闭它并且仅使用UI时才有效(在调用collapseActionView时不会调用)。
  • 我还尝试过在搜索菜单项的XML文件中进行更改。

代码

这是我制作的帮助类:

SearchHolderCompat

public class SearchHolderCompat {
    public MenuItem mSearchMenuItem;
    public SearchView mSearchView;
    private final Activity _context;

    public SearchHolderCompat(final Activity context) {
        _context = context;
    }

    public boolean isCurrentyExpanded() {
        return mSearchMenuItem != null && MenuItemCompat.isActionViewExpanded(mSearchMenuItem);
    }

    public boolean hasQuery() {
        return mSearchMenuItem != null && mSearchView != null && MenuItemCompat.isActionViewExpanded(mSearchMenuItem)
                && !TextUtils.isEmpty(mSearchView.getQuery());
    }

    public void addSearchItemAndInit(final Menu menu, final OnQueryTextListener onQueryTextListener,
            final OnActionExpandListener onActionExpandListener) {
        final MenuInflater menuInflater = _context.getMenuInflater();
        menuInflater.inflate(R.menu.search_menu_item, menu);
        init(menu.findItem(R.id.menuItem_search), onQueryTextListener, onActionExpandListener);
    }

    public void init(final MenuItem searchMenuItem, final OnQueryTextListener onQueryTextListener,
            final OnActionExpandListener onActionExpandListener) {
        this.mSearchMenuItem = searchMenuItem;
        mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
        if (mSearchView == null) {
            MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
                    | MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
            MenuItemCompat.setActionView(searchMenuItem, mSearchView = new SearchView(_context));
        }
        mSearchView.setQueryHint(_context.getString(R.string.search));
        mSearchView.setOnQueryTextListener(onQueryTextListener);
        MenuItemCompat.setOnActionExpandListener(searchMenuItem, onActionExpandListener);
    }

}

MainActivity.java

=>

MainActivity.java

public class MainActivity extends ActionBarActivity {
    SearchHolderCompat mSearchHolder = new SearchHolderCompat(this);

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(final Menu menu) {
        mSearchHolder.addSearchItemAndInit(menu, new OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(final String arg0) {
                android.util.Log.d("AppLog", "onQueryTextSubmit");
                return false;
            }

            @Override
            public boolean onQueryTextChange(final String queryText) {
                android.util.Log.d("AppLog", "onQueryTextChange");
                return true;
            }
        }, new OnActionExpandListener() {

            @Override
            public boolean onMenuItemActionExpand(final MenuItem arg0) {
                android.util.Log.d("AppLog", "onMenuItemActionExpand");
                return false;
            }

            @Override
            public boolean onMenuItemActionCollapse(final MenuItem arg0) {
                android.util.Log.d("AppLog", "onMenuItemActionCollapse");
                return false;
            }
        });
        return true;
    }
}

搜索菜单项.xml

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

    <!-- search items -->
    <item
        android:id="@+id/menuItem_search"
        android:icon="@drawable/ic_action_search"
        android:title="@string/search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always"
        tools:ignore="AlwaysShowAction"/>

</menu>

问题

如何正确处理SearchView和搜索菜单项(使用支持库)?

为什么"MenuItemCompat.setOnActionExpandListener"不起作用?


你的设备API级别是多少? - pskink
1
@pskink SupportMenuItem是一个接口。你不能创建它的新实例...关于设备API级别,它使用的是支持库v7,因此应该可以从API7开始工作。然而,应用程序的minSdk是14(ICS)。我想知道所有版本的解决方案。官方支持库的解决方案。原因是ActionBarActivity不仅支持早期的Honeycomb设备。 - android developer
1
@pskink,我并没有创建它。这是框架的责任。我只是使用“menu.findItem”进行传递。即使您自己添加它,也会得到Android框架的MenuItem。 - android developer
1
@pskink,这是菜单项的类:“android.support.v7.internal.view.menu.MenuItemImpl”。 - android developer
我在这里回答了这个问题:https://dev59.com/oGIj5IYBdhLWcg3wwHpr#28762632 - Sir NIkolay Cesar The First
显示剩余6条评论
4个回答

6

在寻找解决方案几个小时后,我实现了以下内容,并对我有效。(无论如何,我想要展开和折叠事件)
.

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



        if(searchItem != null)
        {

            SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
            // use this method for search process
            searchView.setOnSearchClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    //Search view is expanded
                    showSearchPage();
                }
            });
            searchView.setOnCloseListener(new SearchView.OnCloseListener()
            {
                @Override
                public boolean onClose()
                {
                    //Search View is collapsed
                    hideSearchPage();
                    return false;
                }
            });
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
            {

                @Override
                public boolean onQueryTextSubmit(String query)
                {
                    // use this method when query submitted
                    Toast.makeText(MainActivity.this, query, Toast.LENGTH_SHORT).show();
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText)
                {
                    // use this method for auto complete search process
                    Log.e("SearchValueIs",":"+newText);
                    return false;
                }
            });
        }
        return super.onCreateOptionsMenu(menu);
    }


希望这能对某些人有所帮助...


5

解释?我没有设置collapseActionView,也不想设置,只想设置为ifRoom - user924

1
您可以添加ViewTreeObserver来跟踪android.support.v7.appcompat.R.id.search_edit_frame的可见状态。您可以在此处查看我的答案:https://dev59.com/oGIj5IYBdhLWcg3wwHpr#28762632 您可以在下面看到如何处理展开和折叠状态!
要回答为什么MenuItemCompat.setOnActionExpandListener(...)不起作用,这个侦听器只有在将SearchViewshowAsAction设置为MenuItemCompat.SHOW_AS_ACTION_ALWAYS时才会被调用(您还可以添加更多选项)。 这是我对其他问题的答案副本: 我发现如果您没有传递以下内容,则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);
}

0

我知道我回答得很晚,但希望能对其他人有所帮助。最近我遇到了这个问题,我只是让覆盖方法返回true,它就像魔法一样奏效了。

        @Override
        public boolean onMenuItemActionExpand(final MenuItem arg0) {

            android.util.Log.d("AppLog", "onMenuItemActionExpand");
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(final MenuItem arg0) {

            android.util.Log.d("AppLog", "onMenuItemActionCollapse");
            return true;
        }

在较新的版本中

      menuSearch.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {

            //SearchView appers
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {

            //SearchView disappears
            return true;
        }
    });

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