setOnActionExpandListener

setOnActionExpandListener

背景

我有一个searchView正在使用我创建的特殊类进行初始化,该类已在所有 Activity 和 fragment 中使用。

问题

最近,可能是由于支持库的更新(或者因为到目前为止我还没有使用它,我不记得了),所以我无法捕获searchView的展开/折叠事件。

正如我所发现的,即使我将setSupportActionBar与Toolbar实例一起使用,也会发生这种情况。

我尝试过的

我已经尝试过使用以下每种方法,但是没有一种有效:

  • MenuItemCompat.setOnActionExpandListener。
  • 某些网站建议使用
  • MenuItemCompat.setOnActionExpandListener以及图标化SearchView。
  • 搜索菜单项本身上的
  • setOnActionExpandListener,但随后崩溃,因为在扩展ActionBarActivity时无法使用它。
  • SearchView.setOnCloseListener,但这仅在我关闭它并且仅使用UI时才有效(在调用crashActionView时不会被调用)。
  • 我也尝试过弄乱搜索菜单项的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
    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;
        }
    }
    

    search_menu_item.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”不起作用?

    最佳答案

    寻找了几个小时的解决方案后,我实现了类似的方法。为我工作(无论如何,我想要展开和折叠事件 )

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

    希望它会帮助某人...

    10-08 00:19