4

アクション バーのオーバーフロー メニューに表示されるはずのアクションが Galaxy S3 に表示されないという問題に直面しています。結果として、UX はやや混乱しています。Galaxy S3 のアクション バーは、アプリのロゴと名前を表示するだけで、追加の機能は提供していません。

Android 4.x で実行されているすべてのデバイスで、オーバーフロー メニューのアクションを使用して同一の UX を使用したいと考えています。これは、ActionBarSherlock などのサードパーティ コンポーネントを使用せずに可能ですか?

サルス

4

2 に答える 2

2

これは、本当にこれを行いたいのであれば、いくつかの「悪い」解決策を必要とする一部の製造業者によって下された決定です。オーバーフロー メニューは、すべての Android デバイスが持っていた「通常の」古いメニュー ボタンです。Google が Honeycomb と ICS でメニュー ボタンを削除したとき、一部のメーカーはメニュー ボタンを残すことにしました。これにより、メニュー ボタンとその機能について大きな混乱が生じました。

ただし、S3 を使用しているユーザーは、3 ドット メニューの表示に慣れていないため、機能的なメニュー ボタンがあることを期待することに注意してください。組み込みのメニュー システムを使用するすべてのアプリは、ユーザーが期待する方法で表示される必要があります。そのため、この件に関して、アプリをすべてのデバイスでまったく同じように見せたいという衝動に強く反対することを強くお勧めします. ただし、必要に応じて、「適切な」メニューシステムと「カスタム/偽の」3ドットメニューの両方を実装することは可能です。

この投稿にはいくつかの適切なガイドラインがあるようです: https://stackoverflow.com/a/10713860/1068167

于 2012-12-20T08:23:34.483 に答える
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;
        }
    }
    
于 2013-12-04T21:05:06.077 に答える