Android操作栏子菜单项显示在操作栏顶部而不是栏下方

Bho*_*kra 5 android menu android-actionbar

我需要在栏下方显示子菜单,而不是栏栏本身.

在下面复制我的动作栏xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
    <item
        android:id="@+id/action_pages"
        android:orderInCategory="1"
        android:showAsAction="withText|always"
        android:icon="@drawable/ic_action_pages"
        android:title="">
        <menu>
            <item android:id="@+id/item1" android:title="Placeholder"></item>
        </menu>
    </item>
</menu>
Run Code Online (Sandbox Code Playgroud)

在活动中(App还有一个导航抽屉)

public boolean onCreateOptionsMenu(Menu menu) {
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        getMenuInflater().inflate(R.menu.main, menu);
        restoreActionBar();
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

小智 5

简单地。

<style name="AppTheme" parent="AppBaseTheme">
    <item name="actionOverflowMenuStyle">@style/OverflowMenu</item>
</style>

<style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow">
    <!-- Required for pre-Lollipop. -->
    <item name="overlapAnchor">false</item>

    <!-- Required for Lollipop. -->
    <item name="android:overlapAnchor">false</item>
</style>
Run Code Online (Sandbox Code Playgroud)


Sta*_*tan 1

前言

像往常一样,我在开发 Android 应用程序时遇到了一个奇怪的问题,试图找到解决方案并解决了这个问题。正如之前的许多情况一样,没有答案。因此,我被迫从头开始解决问题,现在用我的解决方法发布答案。

输入

我有一个带有操作栏和一些菜单项的 Android 应用程序,必须使用下拉子菜单来扩展它们。第一次尝试是按照 Android 文档的建议来实现它。因此,我将新的菜单项添加menu_sort到现有的操作栏菜单中,并将子menu容器添加到其中:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
   <item android:id="@+id/id1" android:icon="@drawable/ic_1"
         android:title="@string/id1" android:showAsAction="withText|always"/>
   ...

  <item
    android:id="@+id/menu_sort"
    android:icon="@drawable/ic_menu_sort_selector"
    android:title="&#x25BE;"
    android:titleCondensed="&#x25BE;"
    android:showAsAction="withText|always">
    <menu>
      <item
            android:id="@+id/menu_sort_by_name"
            android:showAsAction="never"
            android:checkable="true"
            android:checked="true"
            android:title="@string/sort_by_name"/>
      <item
            android:id="@+id/menu_sort_by_priority"
            android:showAsAction="never"
            android:checkable="true"
            android:checked="false"
            android:title="@string/sort_by_priority"/>
      <item
            android:id="@+id/menu_sort_by_memory"
            android:showAsAction="never"
            android:checkable="true"
            android:checked="false"
            android:title="@string/sort_by_memory"/>
    </menu>
  </item>
</menu>
Run Code Online (Sandbox Code Playgroud)

结果

效果与问题中描述的完全一样:子菜单显示在操作栏的顶部。这是在 Android 5.1.1 上截取的屏幕截图:

父操作栏顶部的下拉子菜单存在问题

我尝试了很多选项和代码片段 - 没有任何帮助。最后我来到了以下

解决方案

首先,将所有子菜单移动到单独的菜单布局中,例如menu/sorting.xml,并将其从menu_sort主菜单项中删除(如上所示)。

onPrepareOptionsMenu其次,使用以下代码修改或创建事件处理程序:

@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
  // as solution utilizes PopupMenu,
  // take care about older Android versions if necessry
  // if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)

  // here goes most crazy part: we use menu id
  // to retrieve corresponding view, automatically created by OS;
  // imho, this is a hack, and menu item should have getView() method or similar;
  View menuItemView = findViewById(R.id.menu_sort);

  // by the way, menuItemView could probably be null under some circumstances

  // create a popup anchored to the view (menu item)
  final PopupMenu popupMenu = new PopupMenu(this, menuItemView);
  // API 14
  // popupMenu.inflate(R.menu.sorting);
  // API 11 (HONEYCOMB)
  popupMenu.getMenuInflater().inflate(R.menu.sorting, popupMenu.getMenu());

  // process popup clicks as appropriate
  popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
  {
    @Override
    public boolean onMenuItemClick(MenuItem item)
    {
      switch(item.getItemId())
      {
        // ... place some code
      }
      return true;
    }
  });

  // bind the popup to the item menu
  menu.findItem(R.id.menu_sort).setOnMenuItemClickListener(new OnMenuItemClickListener()
  {
    @Override
    public boolean onMenuItemClick(MenuItem item)
    {
      popupMenu.show();
      return true;
    }
  });

  return super.onPrepareOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

操作栏下正确定位的下拉子菜单 - 解决方法

现在,下拉列表从一开始就按预期显示。