3

我有点困惑。我想在三个点项目内显示操作栏的其余项目。但是当物品数量增加时,我总是会丢失它!谷歌搜索了一下后,我发现了这个“有用”的方法:ASMUIRTI ANSWER

private void getOverflowMenu() {
    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();
   }
 }

我对其进行了测试,并且可以按我的意愿工作。不幸的是,为了更好地理解这种方法的作用,我发现这是一个糟糕的 hack,它破坏了与平台上其他应用程序的一致性(adamp 的评论)

有人可以告诉我为什么它是黑客攻击,最好的解决方案是什么?

4

3 回答 3

5

这很简单。有些设备有菜单按钮,有些则没有。在带有菜单按钮的设备上,按下菜单按钮时会显示溢出的操作项,而在没有菜单按钮的设备上,按下三个点时会显示溢出的操作项。这就是设备制造商设计他们的设备的方式,任何强迫他们以不同方式进行操作的尝试都被视为“黑客”。这是不一致的,因为同一设备上的其他应用程序的做法不同。

这一切都归结为一个问题,您是希望跨不同设备的单个应用程序具有一致性,还是希望单个设备上的所有应用程序具有一致性。因为应用程序开发最终应该是关于用户的,所以 IMO 在单个设备(对于一个用户)上的一致性才是真正重要的。

解决这个问题的最佳方法是使用 android:showAsAction 标签,让 Android 决定如何在 ActionBar 中显示操作、是否需要溢出菜单以及用户如何访问溢出的操作项。

于 2013-08-14T16:49:18.880 回答
2

带有菜单按钮的设备不显示溢出菜单。

您使用的代码将在更新的设备上正常工作,并且将显示溢出(三个点)。按照意图,当有菜单按钮时,这些不会显示

没有一个肮脏的黑客,迟早会打破,迫使这些点在所有设备上显示是不可能的

于 2013-08-14T16:44:14.103 回答
1

所以,事实证明这很简单,我最近在我的应用程序中实现了。

需要在溢出菜单中显示的项目,将它们嵌套在一个菜单项下,如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/empty"
        android:orderInCategory="101"
        android:showAsAction="always"
        android:icon="@drawable/ic_action_overflow">

        <menu>        

            <item
                android:id="@+id/action_settings"
                android:orderInCategory="96"
                android:showAsAction="never"
                android:title="@string/menu_settings"
                android:icon="@drawable/ic_action_settings"/>

            <item
                android:id="@+id/action_share"
                android:orderInCategory="97"
                android:showAsAction="never"
                android:title="@string/menu_share"
                android:icon="@drawable/ic_action_share"/>

            <item
                android:id="@+id/action_rate"
                android:orderInCategory="98"
                android:showAsAction="never"
                android:title="@string/menu_rate"
                android:icon="@drawable/ic_action_important"/>

            <item
                android:id="@+id/action_feedback"
                android:orderInCategory="99"
                android:showAsAction="never"
                android:title="@string/menu_feedback"
                android:icon="@drawable/ic_action_edit"/>

            </menu>         
        </item>
</menu>

现在,编辑主活动文件,如下所示:

package com.example.test;
//all your import statements go here

Menu mainMenu=null;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState); }

@Override
public boolean onCreateOptionsMenu(Menu menu) {     
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
mainMenu=menu;
return true; }


//Menu press should open 3 dot menu
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode==KeyEvent.KEYCODE_MENU) {
        mainMenu.performIdentifierAction(R.id.empty, 0);
        return true; }
    return super.onKeyDown(keyCode, event); }
于 2013-11-26T14:59:31.863 回答