当Galaxy S3上没有出现打算在操作栏溢出菜单中显示的操作时,我遇到了问题。因此,UX有点令人困惑 - 我在Galaxy S3上的操作栏只显示应用程序徽标和名称,但不提供额外的功能。
我想在Android 4.x上运行的所有设备上使用相同的UX,并在溢出菜单中执行操作。如果不使用ActionBarSherlock等第三方组件,这是否可行?
Thanls
答案 0 :(得分:2)
这是一些制造商做出的决定,如果您真的想这样做,需要一些“坏”解决方案。溢出菜单只是所有Android设备曾经拥有的“常规”旧菜单按钮。当Google在Honeycomb和ICS中删除菜单按钮时,一些制造商决定保留菜单按钮。这导致对菜单按钮的作用产生了很大的困惑。
您应该记住,使用S3的用户希望有一个功能菜单按钮,因为它们不会用于查看3点菜单。使用内置菜单系统的所有应用程序应以对用户期望的方式显示。因此,我强烈建议不要让你的应用在所有设备上看起来完全相同,因为它很可能会让用户感到困惑,然后帮助他们。如果你愿意的话,应该可以实现“正确的”菜单系统和“自定义/伪造”三点菜单。
这篇文章似乎有一些很好的指导方针: https://stackoverflow.com/a/10713860/1068167
答案 1 :(得分:2)
有一种快速而肮脏的方法可以假设缺少硬件菜单按钮,使用反射在应用的ViewConfiguration
实例中设置字段。
以下代码段可以添加到您的活动中,并在onCreate()
期间调用。
private void enableActionBarOverflow() {
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) {
e.printStackTrace();
}
}
不是一个干净的解决方案,因为ViewConfiguration的实现可能在将来的某个时候发生变化,并且由于sHasPermanentMenuKey
字段是私有的,因此无法保证该字段始终存在。
但是,如果您必须在具有菜单键的设备上拥有溢出菜单,我只会将此作为最后的手段。
假设您的最小API为11(Honeycomb)或更高,更好的解决方案是制作您自己的溢出菜单,如下所示:
在menu.xml中添加溢出的菜单项,将其设置为始终在onCreateOptionsMenu()
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
...
<item
android:id="@+id/action_overflow"
android:icon="@drawable/ic_action_settings"
android:title="@string/settings"
android:showAsAction="always">
</item>
</menu>
,
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
在溢出菜单中为您的选择创建单独的overflow_menu.xml资源
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/overflow_action1"
android:title="@string/overflow_action1">
</item>
<item
android:id="@+id/overflow_action2"
android:title="@string/overflow_action2">
</item>
</menu>
在onOptionsItemSelected()
方法中,处理溢出菜单的选择
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
...
case R.id.action_overflow:
PopupMenu popup = new PopupMenu(
this, findViewById(R.id.action_overflow));
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.overflow_menu, popup.getMenu());
popup.setOnMenuItemClickListener(this);
popup.show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
在您的活动中实施PopupMenu.OnMenuItemClickListener
界面以处理溢出项目的点击次数
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.overflow_action1:
//do stuff
return true;
case R.id.overflow_action2:
//do stuff
return true;
default:
return false;
}
}