Pau*_*ulP 158 android android-actionbar
我想让所有不适合ActionBar的菜单项都进入溢出菜单(从操作栏到菜单按钮),即使在有菜单按钮的设备上也是如此.对于用户而言,这似乎更直观,而不是将它们放入单独的菜单列表中,该列表要求用户从触摸(屏幕)交互跳转到基于按钮的交互,这仅仅是因为ActionBar的布局不能适合他们在栏上.
在模拟器上,我可以将"硬件后退/主页键"值设置为"否"并获得此效果.我已经在代码中搜索了一种方法来实现具有菜单按钮但不能很好的设备的实际设备.谁能帮我?
Tim*_*Ohr 323
你也可以在这里使用这个小黑客:
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception ignored) {
}
Run Code Online (Sandbox Code Playgroud)
放置它的好地方onCreate是你的Application类的方法.
它将强制App显示溢出菜单.菜单按钮仍然有效,但它会打开右上角的菜单.
[编辑]因为它现在出现了好几次:这个hack只适用于Android 3.0中引入的原生ActionBar,而不适用于ActionBarSherlock.后者使用自己的内部逻辑来决定是否显示溢出菜单.如果使用ABS,所有平台<4.0都由ABS处理,因此受其逻辑的影响.黑客仍然适用于Android 4.0或更高版本的所有设备(你可以安全地忽略Android 3.x,因为没有任何平板电脑带有菜单按钮).
存在一个特殊的ForceOverflow-Theme将强制ABS中的菜单,但由于复杂性,它将在未来版本中被删除.
Ale*_*cas 54
编辑:修改为回答物理菜单按钮的情况.
这实际上是通过设计来防止的.根据Android设计指南的兼容性部分,
"...操作溢出可从菜单硬件键获得.弹出的操作弹出...显示在屏幕底部."
您将在屏幕截图中注意到,带有物理菜单按钮的手机在ActionBar中没有溢出菜单.这避免了用户的模糊性,基本上有两个按钮可用于打开完全相同的菜单.
解决跨设备一致性的问题:最终,用户体验更重要的是,您的应用程序与同一设备上的每个其他应用程序的行为一致,而不是在所有设备上与其自身的行为一致.
Ber*_*ťák 35
我通过像这样定义我的菜单(也使用我的例子中使用的ActionBarSherlock图标)来解决它:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_overflow"
android:icon="@drawable/abs__ic_menu_moreoverflow_normal_holo_light"
android:orderInCategory="11111"
android:showAsAction="always">
<menu>
<item
android:id="@+id/menu_overflow_item1"
android:showAsAction="never"
android:title="@string/overflow_item1_title"/>
<item
android:id="@+id/menu_overflow_item2"
android:showAsAction="never"
android:title="@string/overflow_item2_title"/>
</menu>
</item>
</menu>
Run Code Online (Sandbox Code Playgroud)
我承认这可能需要在你的xml中手动"溢出管理",但我发现这个解决方案很有用.
您还可以强制设备在您的活动中使用HW按钮打开溢出菜单:
private Menu mainMenu;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO: init menu here...
// then:
mainMenu=menu;
return true;
}
@Override
public boolean onKeyUp(int keycode, KeyEvent e) {
switch(keycode) {
case KeyEvent.KEYCODE_MENU:
if (mainMenu !=null) {
mainMenu.performIdentifierAction(R.id.menu_overflow, 0);
}
}
return super.onKeyUp(keycode, e);
}
Run Code Online (Sandbox Code Playgroud)
:-)
a f*_*yer 11
如果您使用支持库(android.support.v7.app.ActionBar)中的操作栏,请使用以下命令:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yorapp="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_overflow"
android:icon="@drawable/icon"
yourapp:showAsAction="always"
android:title="">
<menu>
<item
android:id="@+id/item1"
android:title="item1"/>
<item
android:id="@+id/item2"
android:title="item2"/>
</menu>
</item>
</menu>
Run Code Online (Sandbox Code Playgroud)
Android开发者设计系统阻止了这种方法,但我找到了传递它的方法:
将其添加到XML菜单文件中:
<item android:id="@+id/pick_action_provider"
android:showAsAction="always"
android:title="More"
android:icon="@drawable/ic_action_overflow"
android:actionProviderClass="com.example.AppPickActionProvider" />
Run Code Online (Sandbox Code Playgroud)
接下来,创建一个名为"AppPickActionProvider"的类,并将以下代码复制到其中:
package com.example;
import android.content.Context;
import android.util.Log;
import android.view.ActionProvider;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View;
public class AppPickActionProvider extends ActionProvider implements
OnMenuItemClickListener {
static final int LIST_LENGTH = 3;
Context mContext;
public AppPickActionProvider(Context context) {
super(context);
mContext = context;
}
@Override
public View onCreateActionView() {
Log.d(this.getClass().getSimpleName(), "onCreateActionView");
return null;
}
@Override
public boolean onPerformDefaultAction() {
Log.d(this.getClass().getSimpleName(), "onPerformDefaultAction");
return super.onPerformDefaultAction();
}
@Override
public boolean hasSubMenu() {
Log.d(this.getClass().getSimpleName(), "hasSubMenu");
return true;
}
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
Log.d(this.getClass().getSimpleName(), "onPrepareSubMenu");
subMenu.clear();
subMenu.add(0, 1, 1, "Item1")
.setIcon(R.drawable.ic_action_home).setOnMenuItemClickListener(this);
subMenu.add(0, 2, 1, "Item2")
.setIcon(R.drawable.ic_action_downloads).setOnMenuItemClickListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId())
{
case 1:
// What will happen when the user presses the first menu item ( 'Item1' )
break;
case 2:
// What will happen when the user presses the second menu item ( 'Item2' )
break;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我认为Alexander Lucas提供了(不幸的)正确的答案,所以我将其标记为"正确的"答案.我在这里添加的替代答案只是将任何新读者指向Android开发者博客中的这篇文章作为对该主题的相当完整的讨论,并提供一些关于如何在从11级前转换时处理代码的具体建议到新的Action Bar.
我仍然认为这是一个设计错误,没有菜单按钮在菜单按钮启用的设备中表现为冗余的"动作溢出"按钮,作为转换用户体验的更好方式,但此时它在桥下的水.
| 归档时间: |
|
| 查看次数: |
77352 次 |
| 最近记录: |