MenuItemCompat.setOnActionExpandListener不执行任何操作

时间:2014-12-14 12:21:20

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

背景

我使用我制作的一个特殊类来初始化searchView,它被用于所有活动和片段。

问题

最近,可能是由于支持库的更新(或者因为到目前为止我还没有使用它,我不记得),我无法捕捉到扩展/崩溃的事件。搜索查看。

正如我发现的那样,即使我将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

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和搜索菜单项(使用支持库)的正确方法是什么?

怎么来&#34; MenuItemCompat.setOnActionExpandListener&#34;不起作用吗?

4 个答案:

答案 0 :(得分:5)

在寻找几个小时的解决方案后,我实现了这样的事情。并为我工作。 (我想扩展和折叠事件无论如何
点。

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


希望它会帮助某人......

答案 1 :(得分:5)

Android training

app:showAsAction="ifRoom|collapseActionView"

答案 2 :(得分:1)

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

您可以在下面看到如何处理展开和折叠状态!

要回答MenuItemCompat.setOnActionExpandListener(...)无效的原因,只有showAsAction的{​​{1}}设置为SearchView时才会调用此侦听器(您还可以添加更多选项)

这是我在其他问题上的答案副本:

我发现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正在更改视图状态时,ID为android.support.v7.appcompat.R.id.search_edit_frame的LinearLayout视图的可见性值正在从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 :(得分:0)

我知道发布此答案的时间很晚,但希望对其他人有所帮助。我最近遇到了这个问题,我只是使Override方法返回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;
        }
    });