【问题标题】:MenuItemCompat.setOnActionExpandListener doesn't do anythingMenuItemCompat.setOnActionExpandListener 不做任何事情
【发布时间】:2014-12-14 12:21:20
【问题描述】:

背景

我有一个 searchView 正在使用我创建的特殊类进行初始化,该类用于所有活动和片段。

问题

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

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

我尝试过的

我尝试过使用以下每种方法,但都没有奏效:

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

为什么“MenuItemCompat.setOnActionExpandListener”不起作用?

【问题讨论】:

  • 你的设备 api 级别是多少?
  • 您的 MenuItem item 也是 android.support.v4.internal.view.SupportMenuItem 的一个实例吗?见:androidxref.com/5.0.0_r2/xref/frameworks/support/v4/java/…
  • @pskink SupportMenuItem 是一个接口。你不能创建它的新实例...关于设备 API 级别,它使用支持库 v7,所以它应该从 API7 工作。但是,该应用的 minSdk 为 14 (ICS)。我想知道所有版本的解决方案。支持库的官方解决方案。原因是 ActionBarActivity 提供的不仅仅是支持蜂窝之前的设备。
  • @pskink 我没有创建它。它是负责执行此操作的框架。我只是使用 "menu.findItem" 传递它。即使你自己添加,你也得到了Android框架的MenuItem。
  • @pskink 这是菜单项的类:“android.support.v7.internal.view.menu.MenuItemImpl”。

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


【解决方案1】:

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

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


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

【讨论】:

    【解决方案2】:

    Android training

    app:showAsAction="ifRoom|collapseActionView"
    

    【讨论】:

    • 解释?我没有设置collapseActionView,也不想设置,只有ifRoom
    【解决方案3】:

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

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

    要回答为什么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);
    }
    

    【讨论】:

      【解决方案4】:

      我知道我很晚才发布这个答案,但希望它对其他人有所帮助。我最近遇到了这个问题,我只是让 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;
              }
          });
      

      【讨论】:

        猜你喜欢
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 2017-12-31
        相关资源
        最近更新 更多