Androidアクションバーにオーバーフローが表示されない


90

アプリに3つのアイテムのアクションバーがあります。

スペースの問題により表示できるのは2つだけなので、最初のものが表示され、残りがオーバーフローで表示されることを期待します。ただし、実際には最初の2つの項目のみが表示され、オーバーフローは検出されません。

関連するコードは次のとおりです。list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

Activity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}

120
デバイスにメニューボタンがある場合、オーバーフローアイコンは表示されません。どのデバイスを使用していますか?
Reinier 2012年

1
私がテストしている仮想デバイスには確かにメニューボタンがあり、それをクリックすると、不足しているアイテムが表示されます。
Mats Raemen、2012年

2
@Reinier ActionBarSherlockを使用しています。2.3を実行しているGalaxy Aceでは表示されますが、4.0を実行しているGalaxy SIIでは表示されません。どちらにもハードウェアメニューボタンがあります。
ミスタースミス

2
Galaxy Note IIではなく、Nexus 7の購入時にオーバーフローアイコンが表示されたことに困惑したことを確認したかった。Noteにはメニューボタンがありました。ありがとう!
bsautner 2013

@Reinierは私が同じ問題に直面するのを助けてください私は何をすべきですか
2013

回答:


125

デバイスメニューボタンに関係なく、3つのドットを表示したい場合!その後、アプリケーションクラスのonCreateメソッドでこのメソッドを呼び出すことができます

private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    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) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

32
これは、プラットフォーム上の他のアプリとの一貫性を損なう恐ろしいハックです。こんなことしないで。
2013年

19
これは2つの悪の小さい方のようです。現在の動作は許容できません。
biorbnA 2013年

6
これはオーバーフローを許容する優れた方法であり、メニューのハードキーはもはや許容されません。
Necronet 2013

5
それはうまくいきます!ユーザーがハードウェアメニューボタン(すばらしい)を押しても機能しますが、メニューの効果音が2回聞こえます。
Bruce

5
これはハックではありません。Androidでは2 + 2ではないので、開発者は何をハッキングと呼ぶかを知る必要があります。リフレクションは、Javaメカニズムを使用して時間を節約しています。それ以外の場合は、コンテキストを内部クラスに24時間年中無休で渡すか、AOSPを無限にカスタマイズします。私にとってこのソリューションは、純粋主義者がクリーンだと考えるもののために、大量のAOSPカスタムコンテンツとリンクされたプライベートアソシエーションをオーバーライドして含める必要があるという問題を解決します。小さなリストに対して常にFASTSCROLLを強制的に有効にできないことをご存知ですか?リフレクションを使用する前は、1文字の編集のために、10以上のAOSPリソースをコピーする必要がありました。
leRobot 2014

54

アクションバー

res / menu / menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

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

        return super.onCreateOptionsMenu(menu);
    }

}

アクションバーのアイコンセットをダウンロードする


2
@Reinierのコメントを見てください。「デバイスにメニューボタンがある場合、オーバーフローアイコンは表示されません」は本当です。
Ahmad Dwaik 'Warlock'

メニューボタンのあるデバイスでテストすると、オーバーフローが表示されます。私android:showAsAction="always"はより多くのアイテムに使用します
キリットヴァゲラ2013

どのデバイスでテストしましたか?私はneo v xperiaとs#を使用しました
Ahmad Dwaik 'Warlock' '

1
注:オーバーフローメニューを膨らませるアイテムは、showAsAction = "always"を表示する必要があります
Kirit Vaghela '19

1
showAsActionは、古いSDKのandroid名前空間では使用できません。これを克服するには、このリンクdeveloper.android.com/training/basics/actionbar/…に従ってください。このNS schemas.android.com/apk/res-autoを追加した後、上記のトリックは私にとって完全にうまく
いき

42

これはオーバーフローメニューではないことに気づきましたが、似ています。わかりました、これは簡単ですが、理解するのが難しかったです。

最初に、オーバーフローインフレーターとして使用するメニュー項目が必要です。例

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

アイテムを取得したら、必要なアイテムを含むサブメニューをオーバーフローメニューに追加します。例:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

クリックすると、他のアイテムが膨張します。私のアプリケーションはActionBarSherlock 4.0を使用しているため、これが機能する前に、「SplitActionBar」にアクセスする必要があります。(引き続きデフォルトのAndroidアクションバーで動作します)

方法は次のとおりです。AndroidManifest.xmlファイルで、オーバーフローメニューが必要なアクティビティの下にこのコードを追加する必要があります。

android:uiOptions="splitActionBarWhenNarrow"

注:オーバーフローメニューを膨らませるアイテムは、showAsAction="always"

ヴオラ!オーバーフローメニューがあります。お役に立てば幸いです。:)


3
メニューボタンハックよりも優れたソリューションです。
ol0 2013

26

ハードウェアメニューボタンを備えたデバイス(Galaxy S3、Samsungとして頑固です...)では、ハードウェアメニューボタンを使用して、オーバーフローメニューが「従来の」メニューとして動作します。


2
古い回答ですが、互換性ライブラリは非常に奇妙な結果に遭遇しました:ハードウェアボタン付きの3つのデバイス、注3 Neo =オーバーフローメニューが表示され、メニューボタンが機能しません、注1 =オーバーフローなし、メニューボタンは機能します、Galaxy S3、いいえオーバーフロー、メニューボタンが機能しません!狂ってる。
3c71 2014年

5

「オーバーフロー」メニューと言うときは、最後に3つのドットが表示されて、さらに項目があることを示しています...または、オーバーフロー項目の下部に表示される分割アクションバーを意味しますか?

分割アクションバーを意味する場合は、これをアクティビティのマニフェストファイルに追加する必要があります

android:uiOptions="splitActionBarWhenNarrow"

デフォルトでは、3つのドットのオーバーフローメニューが自動的に表示されるはずなので、上記で提供した情報から問題の原因を特定することは困難です。


3つのドットを意味します。アイテムのせいではありません。注文のアイテムを変更するたびに、最初の2つのアイコンが表示されるためです
Mats Raemen

実際の問題を判別できるように、追加情報を提供する必要がありますか?
Mats Raemen

minSdkVersion、targetSdkVersion、およびテストしているバージョンは何ですか?
Sparky

5
お使いのデバイスにはメニュー用の物理ボタンがありますか、それとも銀河のネクサス電話のような仮想ボタンですか?3つのドットは、スマートフォンに物理的なボタンがない場合にのみ表示されると思います。
wnafee

5

actionbarcompatで常にアクションオーバーフロー(3つのドット)を表示するには:
メニューファイルで、例:
main.xml

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

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

そして活動ファイルで:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

それは私にとってはうまくいきました。
Google Nexus S、Samsung S3でテスト済み。


3

メニューボタンのあるデバイスでは、オーバーフローメニューがActionBarに表示されないようです。また、APIレベル14(4.0以降)より前の デバイスにハードウェアメニューボタンがあるかどうかを知る方法もありません。

このソリューションでは、android.support.v7.app.ActionBarオーバーハニカムボタンをに追加して、Honeycomb以前(3.0未満)の標準オプションメニューを開きます。それ以外の場合は、システムに残します。いずれの場合でも、すべてのアクションから、alwaysまたはifRoomすべてのアクションを選択できます。

アクションバーアイコンパックからオーバーフローアイコンを取得します。

メニューを追加します(タイトルとして無関係な部分を省略し、注文など)

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

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

3.0以降のオーバーフローアクションを削除する

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

最後にActivity.openOptionsMenu()、オーバーフローアクションから呼び出します。

えっと…いや。openOptionsMenu()メニューボタンから呼び出すことはできません...しかし、AndroidAnnotationsを使用している場合は、簡単に実行できます。

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

もしそうでなければあなたはこのようなことをすべきだと思います

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}


2

xmlns:your_app_name="http://schemas.android.com/apk/res-auto"メニュータグの中に入れて代わりにandroid:showAsAction="always"使用するyour_app_name:showAsAction="always"

例えば

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.