2

在 Galaxy S3 上,我遇到了一个问题,即 ActionBar 中的按钮配置为 showAsAction="always" 并同时显示在硬件溢出菜单和操作按钮上。我希望它不显示在硬件溢出菜单上,而只显示在操作按钮上。我可以在 onCreateOptionsMenu 中禁用菜单项,但它会隐藏两个地方的按钮。

需要注意的是:如果我强制显示“3 点”动作溢出菜单,刷新按钮会从硬件溢出菜单中正确隐藏,但仍然不会从硬件溢出菜单中隐藏。

还有一点需要注意:如果我在 onCreateOptionsMenu 或 onPrepareOptionsMenu 中调用 menu.size(),它不会反映额外的按钮。例如,我有四个按钮,第一个按钮同时显示在操作按钮和溢出菜单中。menu.size() 仍然返回 4 并且似乎没有意识到它正在显示一个额外的按钮。

我无法发布屏幕截图,因为这是一个客户端应用程序,但这是我的 actionbar.xml 文件。刷新按钮显示在顶部的溢出和操作栏中。

动作栏.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/refreshmenuitem"
          android:icon="@drawable/refreshicon"
          android:title="Refresh"
          android:showAsAction="ifRoom" 
          android:visible="true"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          />
    <item android:id="@+id/helpbutton"
        android:title="Help"
        android:showAsAction="collapseActionView"
        android:icon="@drawable/ic_action_helpbutton" />
    <item android:id="@+id/settingbutton"
        android:title="Settings"
        android:icon="@drawable/ic_action_settingbutton"
        android:showAsAction="collapseActionView" />
    <item android:id="@+id/importbutton"
        android:title="Import file"
        android:icon="@drawable/ic_action_importbutton"
        android:showAsAction="collapseActionView" />
</menu>
4

3 回答 3

2

所以我想通了,但这是一种黑客行为。因此,如果您的手机(如三星 Galaxy S3)有一个硬件菜单按钮,onCreateOptionsMenu 函数实际上会被调用两次。一次用于加载 Activity 以加载应显示在右上角的任何菜单项,另一次用于用户按下硬件菜单按钮。我所做的只是创建一个名为 _firstTimeOnCreateOptionsMenu 的变量,在第一次使用 onCreateOptionsMenu 方法后将其设置为 false:

    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Populates the actionbar/Menu
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.actionbarmenu, menu);
        boolean hardware = false;

        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        {
            hardware = ViewConfiguration.get(context).hasPermanentMenuKey();
        }

        MenuItem b1 = menu.findItem(R.id.refreshmenuitem);

        if(!hardware || _firstTimeOnCreateOptionsMenu)
        {
            b1.setVisible(true);
            _firstTimeOnCreateOptionsMenu = false;
        }
        else
        {
            b1.setVisible(false);
            _firstTimeOnCreateOptionsMenu = true;
        }
    }

希望这可以帮助遇到此问题的其他人。

于 2013-01-08T21:25:31.720 回答
0

您的 targetSdkVersion 是否设置为 14?

http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html

于 2013-01-07T18:30:44.580 回答
0

如果这是问题所在,我会有点惊讶,因为您希望未知的 XML 会被忽略,但根据文档 <item>不支持android:layout_widthandroid:layout_height.

于 2013-01-07T23:31:39.070 回答