我的应用程序中有一个包含 3 个项目的操作栏。
由于空间问题只能显示 2 个,所以我希望显示第一个,其余的显示在溢出中。 但实际上,仅显示前 2 项,并且没有可检测到的溢出。
相关代码如下: 列表_菜单.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/menu_insert"
android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
android:icon="@android:drawable/ic_menu_call"
android:title="@string/menu_call"
android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
android:icon="@android:drawable/ic_menu_agenda"
android:title="@string/menu_agenda"
android:showAsAction="ifRoom|withText"/>
</menu>
活动.java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.list_menu, menu);
return true;
}
如果你想显示三个点,无论设备菜单按钮如何!然后你可以在你的应用程序类的 onCreate 方法中调用这个方法 -
private void makeActionOverflowMenuShown() {
//devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
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) {
Log.d(TAG, e.getLocalizedMessage());
}
}
输出
res/menu/menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Search / will display always -->
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:showAsAction="always"
android:title="@string/action_search"/>
<!-- Location Found -->
<item
android:id="@+id/action_location_found"
android:icon="@drawable/ic_action_location_found"
android:showAsAction="always"
android:title="@string/action_location_found"/>
<!-- More -->
<item
android:id="@+id/a_More"
android:icon="@drawable/ic_action_overflow"
android:showAsAction="always"
android:title="More">
<menu>
<!-- Refresh -->
<item
android:id="@+id/action_refresh"
android:icon="@drawable/ic_action_refresh"
android:showAsAction="never"
android:title="@string/action_refresh"/>
<!-- Help -->
<item
android:id="@+id/action_help"
android:icon="@drawable/ic_action_help"
android:showAsAction="never"
android:title="@string/action_help"/>
<!-- Check updates -->
<item
android:id="@+id/action_check_updates"
android:icon="@drawable/ic_action_refresh"
android:showAsAction="never"
android:title="@string/action_check_updates"/>
</menu>
</item>
</menu>
MainActivity.java
这里的代码主要来自docs。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
}
下载操作栏图标集
我意识到这不是一个溢出菜单,但它是相似的。 好吧,这很简单,但很难弄清楚。
您首先需要一个要用作溢出充气器的菜单项。示例
<item
android:id="@+id/a_More"
android:icon="@drawable/more"
android:showAsAction="always"
android:title="More">
</item>
获得项目后,添加一个子菜单,其中包含您想要在溢出菜单中添加的项目。示例:
<item
android:id="@+id/a_More"
android:icon="@drawable/more"
android:showAsAction="always"
android:title="More">
<menu>
<item
android:id="@+id/aM_Home"
android:icon="@drawable/home"
android:title="Home"/>
</menu>
</item>
点击后,其中的其他物品将会膨胀。我的应用程序使用的是 ActionBarSherlock 4.0,因此在这对您有用之前,您需要访问“SplitActionBar”。 (仍然适用于默认的 Android Actionbar)
具体方法如下: 在您的 AndroidManifest.xml 文件中,您需要在需要溢出菜单的 Activity 下添加此代码。
android:uiOptions="splitActionBarWhenNarrow"
注意: 使溢出菜单膨胀的项目必须
showAsAction="always"
沃拉!你有一个溢出菜单!希望我能帮到你。 :)
在带有硬件菜单按钮的设备上(Galaxy S3,像三星一样顽固......),通过使用硬件菜单按钮,溢出菜单的行为就像“传统”菜单。
当您说“溢出”菜单时,您是指最后显示的三个点,表示还有更多项目......还是指底部显示的用于溢出项目的分割操作栏?
如果您指的是拆分操作栏,您应该将其添加到您的活动的清单文件中
android:uiOptions="splitActionBarWhenNarrow"
默认情况下,三点溢出菜单应该会自动发生,因此很难从您上面提供的信息中判断出问题所在。
要始终在actionbarcompat上显示操作溢出(三个点):
在菜单文件中,例如:
main.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_settings"
android:title="@string/action_settings"
app:showAsAction="never"/>
<item
android:id="@+id/action_about"
android:title="@string/action_about"
app:showAsAction="never"/>
</menu>
并在活动文件中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
对我来说效果很好。
在 Google Nexus S、三星 S3 上测试。
在带有菜单按钮的设备上,溢出菜单似乎不会显示在 ActionBar 中。此外,我们无法知道设备是否有硬件菜单按钮之前API级别14(4.0+)。
此解决方案向
android.support.v7.app.ActionBar
添加了一个溢出按钮,用于打开蜂巢之前的标准选项菜单(<3.0) only, otherwise leaving it to the system. In any case you can choose between always
或 ifRoom
用于所有操作。
从操作栏图标包获取溢出图标。
添加菜单(我省略了一些不相关的部分,如标题、订购等)
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_overflow"
android:orderInCategory="100"
android:icon="@drawable/ic_action_overflow"
app:showAsAction="always" />
<item
android:id="@+id/action_first"
app:showAsAction="always" />
<item
android:id="@+id/action_second"
app:showAsAction="ifRoom" />
</menu>
删除 3.0+ 上的溢出操作
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
menu.removeItem(R.id.action_overflow);
}
return super.onPrepareOptionsMenu(menu);
}
最后从溢出操作中调用
Activity.openOptionsMenu()
。
呃...不。您不能不从菜单按钮调用
openOptionsMenu()
...但如果您使用 AndroidAnnotations,您就可以轻松完成:
@OptionsItem
void action_overflow() {
openOptionsMenuDeferred();
}
@UiThread
void openOptionsMenuDeferred() {
openOptionsMenu();
}
如果不是你应该做这样的事情,我想
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == id.action_overflow) {
openOptionsMenuDeferred();
return true;
}
}
private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
handler.post(new Runnable() {
@Override
public void run() {
openOptionsMenu();
}
}
);
}
尝试更改应用程序的主题 Theme.AppCompat.Light.DarkActionBar 到 Theme.AppCompat.Light
将
xmlns:your_app_name="http://schemas.android.com/apk/res-auto"
放入菜单标签内
而 android:showAsAction="always"
使用 your_app_name:showAsAction="always"
例如
<item
android:id="@+id/action_search"
android:icon="@drawable/icon_search"
android:title="@string/search"
your_app_name:showAsAction="ifRoom"/>