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)
前言
像往常一样,我在开发 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="▾"
android:titleCondensed="▾"
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)
结果如下:

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