如何在Galaxy S3上向Overflow菜单添加操作?

时间:2012-08-21 19:59:03

标签: android android-actionbar galaxy

当Galaxy S3上没有出现打算在操作栏溢出菜单中显示的操作时,我遇到了问题。因此,UX有点令人困惑 - 我在Galaxy S3上的操作栏只显示应用程序徽标和名称,但不提供额外的功能。

我想在Android 4.x上运行的所有设备上使用相同的UX,并在溢出菜单中执行操作。如果不使用ActionBarSherlock等第三方组件,这是否可行?

Thanls

2 个答案:

答案 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)或更高,更好的解决方案是制作您自己的溢出菜单,如下所示:

  1. 在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);
    }
    
  2. 在溢出菜单中为您的选择创建单独的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>
    
  3. 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);
            }
    }
    
  4. 在您的活动中实施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;
        }
    }