我做了一个全新的项目。我已将项目添加到menu
布局文件中。这些项目不会显示在操作栏的右侧。我记得有一个带有三个点的图标会打开菜单。
这是我的Activity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.setBackgroundDrawable(new ColorDrawable(Color.BLUE));
actionBar.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
这是我的main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_option1"/>
<item
android:id="@+id/action_settings34"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_option2"/>
<item
android:id="@+id/action_settings3"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_option3"/>
</menu>
答案 0 :(得分:116)
在菜单配置中似乎存在对此showAsAction
属性的误解。我在许多stackoverflow答案中找到的信息似乎总是不完整的。所以这是尝试改变它。
无法控制操作栏是否在代码中显示三点溢出菜单。
你可以通过没有选项菜单来强迫它不显示。公平地说,您可以在How to force use of overflow menu on devices with menu button
处查看更多信息显示与否的点取决于您正在测试的设备。带有菜单按钮的设备不会显示操作栏上的三个点图标,因为用户可以使用设备上的菜单按钮。
没有此选项菜单按钮的设备(如从Galaxy开始的nexus设备)无法触发该选项菜单。在这些设备上运行相同的应用程序将在操作栏中显示三点溢出菜单选项。
菜单xml文件中有showAsAction
选项,您可以使用控制单个菜单选项在操作栏中的显示方式。
根据官方menu resource doc,选项是:
android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
ifRoom
标记仅在有足够空间时显示该选项。在大多数情况下,这应该是您的首选。然而,这将在操作栏中压缩标题(请参阅垂直方向的屏幕截图)。
never
标志将始终在溢出菜单中使用此选项,并且永远不会直接在操作栏中。
不鼓励使用 always
标志,因为它会强制该选项始终显示在acitonbar中。即使在非常小的屏幕尺寸上运行。这可能会使标题完全不可见。
正如您现在可能的选项菜单可以包含android:title
和android:icon
属性。您可以将 withText
标记与always
或ifRoom
一起使用(在其间使用管道|
)以强制项目的文本在动作栏中呈现时显示在图标旁边。
仅collapseActionView
支持 API level 14
,所以让我忽略这一点。
屏幕截图,显示在纵向模式下设备上的以下代码段:
另一个屏幕截图,由于横向模式,操作栏中有更多空间:
关于此操作栏的最佳开发文档是the actionbar guide。如果您查看更多for design guidelines follow this link。之前列出了menu resource link。对于menus in general check this。
该代码仅供参考,因为该部分似乎在大多数答案中都是正确的。可以在https://github.com/AndroidExamples/fragment-navigation
找到更完整的示例 /res/menu/main.xml
文件内容:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="be.hcpl.android.example.MainActivity" >
<!-- an option that never appears as a fixed text/icon in the actionbar -->
<item android:id="@+id/action_one"
android:title="@string/action_one"
android:orderInCategory="100"
app:showAsAction="never" />
<!-- another option that only appears if there is enough room -->
<item android:id="@+id/action_two"
android:title="@string/action_two"
android:orderInCategory="200"
app:showAsAction="ifRoom" />
<!-- a last option that always appears -->
<item android:id="@+id/action_three"
android:title="@string/action_three"
android:orderInCategory="300"
app:showAsAction="always" />
<!-- an option to show with both icon and text -->
<item android:id="@+id/action_four"
android:icon="@android:drawable/ic_menu_directions"
android:title="@string/action_four"
android:orderInCategory="400"
app:showAsAction="withText|always" />
<!-- an option to always show as an icon only -->
<item android:id="@+id/action_five"
android:icon="@android:drawable/ic_menu_info_details"
android:title="@string/action_five"
android:orderInCategory="500"
app:showAsAction="always" />
</menu>
答案 1 :(得分:42)
由于您将showAsAction
属性设置为never
,因此这些菜单项永远不会显示为操作视图。试试这个:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:title="@string/action_option1"/>
<item
android:id="@+id/action_settings34"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:title="@string/action_option2"/>
<item
android:id="@+id/action_settings3"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:title="@string/action_option3"/>
</menu>
答案 2 :(得分:9)
我想你总是要在右上角显示溢出菜单图标,并希望你的菜单从那里打开。尝试类似下面的内容强制它:
在onCreate()
内:
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if(menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception ex) {
// Ignore
}
它将强制App显示溢出菜单。菜单按钮仍然有效,但它会打开右上角的菜单。取自this的How to force use of overflow menu on devices with menu button回答。这可能是一种“黑客”,但它有效。
修改强>
基于@gunar的有用评论,我请求不使用此方法。以下是原因:
私有字段sHasPermanentMenuKey
将来可以重构
版本。您的应用将停止工作。
此外,如果您强制将动作项移动到操作栏,因为您是
习惯了他们,你最终会混淆用于应用程序方式的用户
在他们的设备上运行。具有硬件menu
密钥的那些将被用于
从菜单硬件键中显示选项。如果你故意
向他们展示溢出菜单的三个点,可能会让他们感到困惑。
因此,让所有应用程序在这个意义上都是统一的。那些没有menu
项目硬件密钥的设备会自动显示这些设备。
答案 3 :(得分:7)
或者您可以创建如下结构:
<?xml version="1.0" encoding="utf-8"?>
<menu >
<item
android:id="@+id/menu_main"
android:icon="@drawable/icon_menu"
android:showAsAction="always"
android:title="@string/menu_A"
android:visible="true">
<menu>
<item
android:id="@+id/menu_settings1"
android:showAsAction="never"
android:title="@string/menu_A1"/>
<item
android:id="@+id/menu_settings2"
android:showAsAction="never"
android:title="@string/menu_A2"/>
<item
android:id="@+id/menu_settings3"
android:showAsAction="never"
android:title="@string/menu_A3"/>
</menu>
</item>
</menu>
在icon_menu中,您可以使用三个点图标剪贴画创建一个新图标。
答案 4 :(得分:6)
我遇到了同样的问题。我做了上面提到的所有事情。我的问题是我忘记覆盖onCreateoptionMenu(菜单菜单)。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu,menu);
return super.onCreateOptionsMenu(menu);
}
答案 5 :(得分:3)
添加
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
在onCreate方法中。
答案 6 :(得分:2)
在搜索并阅读了大量答案之后,我发现还有一件事你应该注意。
至少这是我的问题,我没有找到任何上述答案。在您的.XML
文件上。您的android:showAsAction=
不应该是android
套件,应该来自app
包,如下例所示:
app:showAsAction=
不要忘记导入app
包。
答案 7 :(得分:1)
我必须在setHasOptionsMenu(true)
或onViewCreated
中设置onCreate
答案 8 :(得分:0)
您需要在活动的onCreate函数中调用此函数。
RequestWindowFeature (Window.FEATURE_ACTION_BAR);
答案 9 :(得分:0)
以上所有答案都很好地解释了这个问题
但我们可以覆盖此限制并拥有溢出菜单项吗?!!
是的,我们可以破解
"no value specified for 11"
并在onCreate里面调用它
答案 10 :(得分:0)
为showAsAction和actionViewClass
添加这样的自定义命名空间<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
android:title="@string/search"
android:icon="@drawable/ic_search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.widget.SearchView" />
答案 11 :(得分:0)
对我有用的是更改menu.xml中的属性
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom" android:icon="@drawable/ic_filter"/>
这曾经用于Material
主题,但不适用于AppCompat
主题和活动,因此我更改了menu.xml的方式,并在名称空间““ {{3]下添加了app:showAsAction=
属性}}“
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom" app:showAsAction="ifRoom" android:icon="@drawable/ic_filter"/>
从活动膨胀菜单通过OnCreateOptionsMenu(IMenu menu)
现在从OnOptionsItemSelected()
,我还可以将选定的项目ID作为
public override bool OnOptionsItemSelected(IMenuItem item)
{
switch (item.ItemId)
{
case Resource.Id.gamingactivity_filter:
OnBackPressed();
break;
}
}
return true;
}