【问题标题】:Action bar only shows one item next to search view操作栏仅在搜索视图旁边显示一项
【发布时间】:2016-10-09 18:25:47
【问题描述】:

我想在操作栏中有一个搜索视图和两个按钮。所以我创建了 menu/options_menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_search"
    android:title="Search"
    android:icon="@drawable/ic_menu_search"
    android:showAsAction="always"
    android:actionViewClass="android.widget.SearchView" />

<item
    android:title="Route"
    android:id="@+id/action_route"
    android:icon="@drawable/route"
    android:showAsAction="always" />

<item
    android:title="Cancel"
    android:id="@+id/action_cancel"
    android:icon="@drawable/cancel"
    android:showAsAction="always" />

</menu>

我在代码中膨胀它:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false);

    return true;
}

这是我得到的:

如您所见,仅显示第一项(“路线”)。 如果我让搜索小部件图标化,我可以使第二项(“取消”)可见:

    //searchView.setIconifiedByDefault(false);

但是,我希望扩展搜索小部件并使这两个项目都可见。有可能吗?

更新

我设法通过为“路线”和“取消”设置android:orderInCategory="1" 以及为搜索小部件设置android:orderInCategory="2" 使它们可见:

这几乎就是我想要的。问题是我希望搜索小部件首先(最左边),然后是这两个项目。有可能吗?

更新 2

我尝试了“推荐”的方式。我设置为SearchView

android:showAsAction="always|collapseActionView"

点击搜索图标后,我得到扩展视图:

两个问题:

  1. (次要)导航 UI 占据了左侧的一个房间,从而减少了SearchView 的可用空间。
  2. (主要)Android 图标显示为导航 UI 的一部分。我可以摆脱它吗?

【问题讨论】:

  • 明白这一点。用户将单击搜索按钮,他们希望与现在扩展的搜索小部件进行交互。别的什么都不在乎。他们想搜索。任何其他按钮都只是分散注意力。任何与手头任务无关的按钮都可以隐藏。这是一个伪问题。默认情况下折叠搜索按钮,如下所示developer.android.com/training/search/setup.html
  • @Eugen Pechanec 感谢您的评论。我尝试了您的建议并更新了我的问题。我可以删除出现在操作栏左侧的 Android 图标吗?
  • 如果您使用 Material 或 AppCompat 主题(强烈建议),导航箭头将关闭搜索视图并且图标消失。如果您无法使用 Material 或 AppCompat 主题,请致电getActionBar().setIcon(new ColorDrawable(0)); 删除图标。
  • @Nick 我的回答是否有效?
  • @Nick 我的回答有帮助吗?

标签: android android-actionbar searchview


【解决方案1】:

我通过设置搜索视图的最大宽度来做到这一点,等于屏幕宽度减去操作项宽度。

res/menu/search.xml

<?xml version="1.0" encoding="utf-8"?>
<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="@drawable/ic_search_white_24dp"
        android:title="@string/title_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always" />
    <item
        android:id="@+id/action_filter"
        android:icon="@drawable/ic_filter_list_white_24dp"
        android:title="@string/title_filter"
        app:showAsAction="always" />
</menu>

活动或片段:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.search, menu);
    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setIconified(false);
    searchView.setMaxWidth(getSearchViewMaxWidth());
    searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            performSearch("");
            return true; // Disable dismissing the search view
        }
    });
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            performSearch(query);
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
}

@Px
private int getSearchViewMaxWidth() {
    final int screenWidth = getResources().getDisplayMetrics().widthPixels;
    final int actionItemWidth = getResources().getDimensionPixelSize(R.dimen.action_item_width);
    return screenWidth - actionItemWidth;
}

res/values/dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- ... -->
    <dimen name="action_item_width">48dp</dimen>

</resources>

【讨论】:

    【解决方案2】:

    创建了一个演示,检查一下:

    menu.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:title="Search"
            android:icon="@android:drawable/ic_search_category_default"
            app:actionLayout="@layout/searchview"
            app:showAsAction="always|collapseActionView"/>
    
        <item
            android:title="Route"
            android:id="@+id/action_route"
            android:icon="@mipmap/ic_launcher"
            app:showAsAction="always" />
    
        <item
            android:title="Cancel"
            android:id="@+id/action_cancel"
            android:icon="@mipmap/ic_launcher"
            app:showAsAction="always" />
    
    </menu>
    

    searchview.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <SearchView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

    Java:

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu, menu);
    
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            MenuItem searchItem = menu.findItem(R.id.action_search);
            SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
            if(searchItem!=null) {
                searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
                searchView.setIconifiedByDefault(false);
            }
    
            return true;
        }
    

    根据要求编辑 Java(始终打开搜索视图):

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu, menu);
    
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            MenuItem searchItem = menu.findItem(R.id.action_search);
            searchItem.expandActionView();
            final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
            if(searchItem!=null) {
                searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
                searchView.setIconifiedByDefault(false);
                // This listener use for handle back press if you want to go back without collapsing searchview
                MenuItemCompat.setOnActionExpandListener(searchItem,new MenuItemCompat.OnActionExpandListener() {
    
                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
                        return true;
                    }
    
                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
                        onBackPressed();
                        return false;
                    }
                });
            }
            return true;
        }
    

    截图:

    【讨论】:

    • MenuItemCompat.setOnActionExpandListener 已弃用。有什么代码可以代替吗?
    【解决方案3】:

    如下更改您的onCreateOptionsMenu 以明确设置在SearchView 菜单项具有焦点时可见的菜单项。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);
    
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    
    
        if (menu.getItem(0).isFocused()) //detect if search view has focus 
        {
            //explicitly set menu items visible
            menu.getItem(1).setVisible(true);
            menu.getItem(2).setVisible(true);
        }
    
        return true;    
    }
    

    【讨论】:

    • 它对我不起作用。第二项(取消)在纵向中仍然不可见。
    【解决方案4】:

    您可以通过此自定义扩展搜索视图的宽度

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);
    
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    
        ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.MATCH_PARENT);
            params.width=500;
            searchView.setLayoutParams(params);
            menu.findItem(R.id.action_search).expandActionView();
        return true;
    }
    

    【讨论】:

      【解决方案5】:

      试试这个:

      <menu xmlns:android="http://schemas.android.com/apk/res/android">
      <item android:id="@+id/action_search"
          android:title="Search"
          android:icon="@drawable/ic_menu_search"
          android:orderInCategory="1"
          android:showAsAction="collapseActionView|ifRoom"
          android:actionViewClass="android.widget.SearchView" />
      
      <item
          android:title="Route"
          android:id="@+id/action_route"
          android:icon="@drawable/route"
          android:orderInCategory="2"
          android:showAsAction="always" />
      
      <item
          android:title="Cancel"
          android:id="@+id/action_cancel"
          android:icon="@drawable/cancel"
          android:orderInCategory="2"
          android:showAsAction="always" />
      
      </menu>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2016-11-05
        • 2014-11-29
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多