3

私は少し混乱しています。アクションバーの残りのアイテムを 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();
   }
 }

私はそれをテストし、それは私が望むように動作します。残念ながら、このメソッドが何をするのかをよりよく理解しようとすると、プラットフォーム上の他のアプリとの一貫性を損なうひどいハックであることがわかりました(adamp のコメント)

なぜそれがハックなのか、そして最善の解決策は何か教えてもらえますか?

4

3 に答える 3

5

それは簡単です。一部のデバイスにはメニュー ボタンがあり、他のデバイスにはありません。メニュー ボタンのあるデバイスでは、メニュー ボタンを押すとオーバーフロー アクション アイテムが表示され、3 つのドットを押すと表示されないデバイスではオーバーフロー アクション アイテムが表示されます。これは、デバイス メーカーがデバイスを設計した方法であり、別の方法で強制しようとする試みは「ハック」と見なされます。同じデバイス上の他のアプリが異なる方法で行うため、一貫性がありません。

結局のところ、異なるデバイス間で単一のアプリの一貫性を維持したいのか、それとも単一のデバイス上のすべてのアプリの一貫性を維持したいのかという問題に行き着きます. アプリ開発は最終的にはユーザーに関するものであるべきなので、IMO では 1 つのデバイス (1 人のユーザー) での一貫性が本当に重要です。

これに対処する最善の方法は、android:showAsAction タグを使用して、ActionBar にアクションを表示する方法、オーバーフロー メニューが必要かどうか、ユーザーがオーバーフローしたアクション アイテムにアクセスする方法を Android に決定させることです。

于 2013-08-14T16:49:18.880 に答える
2

メニューボタンのあるデバイスでは、オーバーフローメニューは表示されません。

使用したコードは最新のデバイスで正常に動作し、オーバーフロー (3 つのドット) が表示されます。意図したとおり、メニュー ボタンがある場合、これらは表示されません。

これらのドットをすべてのデバイスで強制的に表示するために、遅かれ早かれ壊れる汚いハックなしには方法がありません

于 2013-08-14T16:44:14.103 に答える
1

それで、それは非常に単純であることがわかりました。私は最近自分のアプリに実装しました。

オーバーフロー メニューに表示する必要がある項目は、次のように 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 に答える