web-dev-qa-db-ja.com

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

アプリに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;
}
90
Mats Raemen

デバイスメニューボタンに関係なく、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());
    }
}
125
Atul Kaushik

Action Bar

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);
    }

}

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

54
Kirit Vaghela

これはオーバーフローメニューではありませんが、似ています。さて、これは簡単ですが、理解するのは困難でした。

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

<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 Actionbarでも引き続き機能します)

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

Android:uiOptions="splitActionBarWhenNarrow"

注:オーバーフローメニューを拡張するアイテムはshowAsAction="always"でなければなりません

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

42
LeviRockerSk8er

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

26
Lukas Batteau

「オーバーフロー」メニューと言うとき、最後に表示される3つの点がアイテムの数が多いことを示しますか?...またはオーバーフローアイテムの下部に表示される分割アクションバーを意味しますか?

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

Android:uiOptions="splitActionBarWhenNarrow"

デフォルトでは、3つのドットオーバーフローメニューが自動的に表示されるため、上記で提供した情報から問題が何であるかを判断するのは困難です。

5
wnafee

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でテスト済み。

5
MrSiro

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

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

Action Bar Icon Pack からオーバーフローアイコンを取得します。

メニューを追加します(タイトル、注文など、関連のない部分は省略します)

<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();
        }
    }
    );
}
3
IlDan

アプリのテーマをTheme.AppCompat.Light.DarkActionBarからTheme.AppCompat.Lightに変更してみてください

2
Sagar Devanga

メニュータグ内に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"/>
2
Rashmi Jain