【问题标题】:Android action bar overflow menu not displayed in portrait modeAndroid操作栏溢出菜单不以纵向模式显示
【发布时间】:2014-08-30 07:46:57
【问题描述】:

我有一个带有 SearchView 和一些纯文本菜单项的标准 Android 操作栏(我没有使用兼容性库)。我想让 SearchView 始终展开,并且溢出菜单中的剩余项目。到目前为止,我的代码在平板电脑和横向模式下的 Nexus 5 上运行良好,但是当手机处于纵向模式时,不会显示溢出菜单。如果我将 collapseActionView 属性添加到 SearchView,溢出菜单会正确显示,但我想保持搜索小部件完全展开。

这是我的选项菜单的 XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/menu_search"
          android:icon="@android:drawable/ic_menu_search"
          android:title="@string/search"
          android:showAsAction="ifRoom"
          android:actionViewClass="android.widget.SearchView" />
    <item android:id="@+id/action_clear_history"
          android:title="@string/action_clear_history"
          android:showAsAction="never"/>
    <item android:id="@+id/action_feedback"
          android:title="@string/action_feedback"
          android:showAsAction="never"/>
    <item android:id="@+id/action_about"
          android:title="@string/action_about"
          android:showAsAction="never"/>
</menu>

这是我的onCreateOptionsMenu 代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        getMenuInflater().inflate(R.menu.options_menu, menu);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
        restoreActionBar();
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}

这是横向模式的屏幕截图,按预期工作:

这是纵向模式,缺少溢出菜单:

谁能指出我正确的方向?

【问题讨论】:

  • 如何使用拆分ActionBar(splitActionBarWhenNarrow)?这应该会让你回到纵向的溢出菜单
  • 谢谢。这确实给了我一个溢出菜单,尽管在底部操作栏中。我希望将所有内容都保留在顶部操作栏中,并调整搜索小部件的大小以适应应用程序图标和溢出菜单图标,就像展开图标化搜索小部件一样。但这可能是一个错误的目标。看起来 Google 自己的所有应用程序都将搜索小部件图标化,并且尝试将扩展的搜索小部件与其他图标一起放置可能会导致问题。但我还是很好奇能不能做到!
  • splitActionBarWhenNarrow 是一个特别好的选择,如果您希望一个或多个溢出操作是 showAsActionIfRoom

标签: android android-actionbar


【解决方案1】:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_search"
          android:icon="@android:drawable/ic_menu_search"
          android:title="@string/search"
          android:showAsAction="ifRoom"
          android:actionViewClass="android.widget.SearchView"/>
    <item
          android:id="@+id/menu_item_more"
          android:icon="@drawable/ic_overflow"
          android:showAsAction="always"
          android:title="CLICK FOR MORE OPTIONS">
        <menu>
            <item android:id="@+id/action_clear_history"
                  android:title="@string/action_clear_history"
                  android:showAsAction="never"/>
            <item android:id="@+id/action_feedback"
                  android:title="@string/action_feedback"
                  android:showAsAction="never"/>
            <item android:id="@+id/action_about"
                  android:title="@string/action_about"
                  android:showAsAction="never"/>
        </menu>
    </item>    
</menu>

我添加了一个item,其中包含对溢出子菜单的引用,如果需要,您可以试试这个,或者可以提出疑问。和ic_overflow 图标可以是

【讨论】:

  • 谢谢。这种方法肯定会奏效。不过,我很好奇是否有任何方法可以解决这个问题而无需创建自己的菜单。
  • @Ben 感谢您提供赏金,因为这是我的第一个,我会尝试弄清楚您在之前的评论中所说的内容,如果发现任何问题,我会发布答案。
  • 没问题!除了使用您描述的方法外,我不确定是否有任何解决此问题的方法。感谢您的帮助。
【解决方案2】:

我有类似的问题,有用所以我发现是这样的:SearchView taking all the space in the new ActionBarCompat,所以解决方案是从代码手动添加 SearchView,而不是从你的菜单布局。

这是我在 api 19 上成功使用的一些代码,在带有支持操作栏的片段中:

public void initSearchView() {
    searchView = new SearchView(getActionBarHelper().getThemedContext());
    searchView.setIconifiedByDefault(false);

    ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(
        ActionBar.LayoutParams.MATCH_PARENT,
        ActionBar.LayoutParams.WRAP_CONTENT, Gravity.RIGHT
        | Gravity.CENTER_VERTICAL);
    searchView.setLayoutParams(layoutParams);

   getActionBarHelper().setCustomView(searchView);
   getActionBarHelper().setDisplayShowCustomEnabled(true);

   searchView.setOnQueryTextListener(mOnQueryTextListener);
   searchView.clearFocus();
   searchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
}

  protected ActionBar getActionBarHelper() {
    return ((ActivityBase) getActivity()).getSupportActionBar();
  }

我在onCreateView()中调用initSearchView,

【讨论】:

    【解决方案3】:

    试试

    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class
                .getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • 谢谢,但不幸的是,这并不能解决问题。这款手机没有菜单按钮,所以我认为这不是问题。
    • 永远不要尝试这样做,正如 mansoulx 所说,这是一个丑陋的黑客攻击