如何使用Actionbarsherlock在低于4.0版本的设备上强制显示溢出菜单

8

可能是重复问题:
ActionBarSherlock&HoloEverywhere-强制溢出?

我正在使用ActionbarSherLock库在Gingerbread之前的设备上显示Actionbar。

我想要Actionbar上的溢出菜单。我已经搜索了很多,我知道那些有硬件菜单按钮的设备将无法显示溢出菜单。

我还查看了ActionbarSherlock示例演示的解决方案,但仍然找不到解决方案。

我创建了一个演示动作栏,当在没有菜单按钮的设备上模拟时,它将显示溢出菜单,但如果设备有菜单按钮,则不会显示溢出菜单。

以下是我的配置:

 public class MainActivity extends SherlockActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater=getSupportMenuInflater();
        inflater.inflate(R.menu.activity_main, menu);

//        return true;
        return super.onCreateOptionsMenu(menu);
    }
}

清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="demo.menu.actionbar_using_lib"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />

 <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock"
     >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" 
       >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

菜单配置:-
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/save"
    android:title="@string/menu_save"
    android:icon="@drawable/ic_action_search"
    android:showAsAction="ifRoom|withText"/>

 <item android:id="@+id/setting"
    android:title="@string/menu_settings"
    android:icon="@drawable/ic_action_search"
    android:showAsAction="ifRoom|withText"/>


  <item android:id="@+id/search"
    android:title="@string/menu_search"
    android:icon="@drawable/ic_action_search"
    android:showAsAction="never"/>


   <item android:id="@+id/refresh"
    android:title="@string/menu_refersh"
    android:icon="@drawable/ic_action_search"
    android:showAsAction="never"/>

    <item android:id="@+id/edit"
    android:title="@string/menu_edit"
    android:icon="@drawable/ic_action_search"
    android:showAsAction="never"/>


     <item android:id="@+id/delete"
    android:title="@string/menu_delete"
    android:icon="@drawable/ic_action_search"
    android:showAsAction="never"/>

我想显示溢出菜单,请给我建议。谢谢提前。

相关链接:https://dev59.com/S2Ys5IYBdhLWcg3wDfp5 - Mister Smith
@SiddharthLele 我正在使用最新版本的ABS。 - Kinjal Shah
我已经成功地使用了在可能的重复链接中描述的方法,但你应该知道,在3.0+设备上使用实际操作栏时,如果设备有菜单键,则不会显示。这就是为什么在最新版本的ABS中删除了这个强制功能。这是为了更好的用户体验,除非你想提供不一致的用户体验。 - Mister Smith
@MisterSmith,根据您的说法,我需要做什么?我需要使用旧版本的ABS吗? - Kinjal Shah
我在这里进行了详细说明:https://dev59.com/S2Ys5IYBdhLWcg3wDfp5#13341458 - Mister Smith
显示剩余6条评论
1个回答

15

注意: 我这个建议并不是向任何读者推荐使用ForceOverFlow。这只是列举了一个让它工作的可能性(强制其工作而已)。每个人都有自己的选择。有些人可能想要并且也喜欢它,而其他人则可能不喜欢。

我可能在猜测,但也许这对你有用。

你可以把这看作是一个技巧,但我之前曾经在我的一个应用程序中使用过它来强制 Overflow 菜单正常工作,而它确实奏效了。

try {
    ViewConfiguration config = ViewConfiguration.get(MainPage.this);
    Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
    if (menuKeyField != null) {
        menuKeyField.setAccessible(true);
        menuKeyField.setBoolean(config, false);
    }
} catch (Exception e) {
    e.printStackTrace();
}

此外,MisterSmith 提供的第二个链接中有一个解决方案,我的答案也在其中。Commonsware 讨论了如何在这里强制使用 OverFlow 菜单:How To Control use of OverFlow Menu in ICS

编辑:当我输入这个建议时,您添加了一条评论。为了回应这一点,我想指出,Jake Wharton 取消了 .ForceOverFlow 主题。我还没有尝试过版本4.2.0,但是通过自定义主题,它可能会起作用。如果您绝对必须使用 ForceOverFlow,则可能需要使用旧版本。请阅读我在这里的答案:https://dev59.com/S2Ys5IYBdhLWcg3wDfp5#13180285。某些东西可能会让它起作用。

编辑 2:正如 OP 在评论中指出的那样,示例 APK 中的 Demos 实际上强制 Action Modes 中的操作栏使用 ForceOverFlow。在查看 github 上的相关 Java 文件之后,我有一种感觉,答案可能在 3 个 Java 文件中:

  1. Activity ActionModes 以非常非传统的方式添加 menu itemshttps://github.com/JakeWharton/ActionBarSherlock/blob/master/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java(第 53 行)
  2. ABS 库中的 ActionMode Java 文件:https://github.com/JakeWharton/ActionBarSherlock/blob/master/library/src/com/actionbarsherlock/view/ActionMode.java
  3. 再次是 ABS 库中的 MenuItem Java 文件:https://github.com/JakeWharton/ActionBarSherlock/blob/master/library/src/com/actionbarsherlock/view/MenuItem.java

我看了你的答案,我有一个想法该怎么做...但我仍然困惑是否应该使用旧版本的ABS? - Kinjal Shah
首先,你必须意识到使用旧版本的陷阱。请阅读ChangeLog。新版本中有几个修复。如果它们对您的应用程序的功能不是至关重要的话,那么我想这值得一试。但你必须真正问问自己,ForceOverFlow真的值得吗? - Siddharth Lele
我想知道我是否已经在我的Galaxy Y设备上安装了ActionBarSherlock示例演示,并且它将显示溢出菜单。但是我已经创建了演示,但它不会显示溢出菜单……为什么会发生这种情况? - Kinjal Shah
@RyanDawkins:这是Field实例所需的导入:java.lang.reflect.Field - Siddharth Lele
@RyanDawkins:在“values”文件夹中。搜索术语“Overflow”应该会为您突出显示它们。将它们复制到最新的ABS副本中。再次强调,这只是一种理论。我实际上并没有做过任何这样的事情。我相信开发人员有很好的理由将它们删除。但是,如果我仍然需要它们,这就是我会尝试的方法。 - Siddharth Lele
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接