web-dev-qa-db-ja.com

オーバーフローメニューをツールバーに追加する方法

私はアプリでAndroid ActionBarを使用しようとしていますが、オーバーフローメニューに隠れているオプションがあります。

そこには多くのドキュメントがありますが、そのほとんどは非常に古いバージョンのAndroidにのみ関連するため、混乱を招きます。同じ概念を適用しようとしても、機能しなくなったり、動作が異なったりします。

これは私のActivityレイアウトにあります

_<Android.support.v7.widget.Toolbar
    Android:id="@+id/my_toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:titleTextColor="@Android:color/white"
    Android:background="@color/colorPrimary"
    Android:elevation="4dp"
    Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
_

そして、これは私のActivityonCreate()メソッドにあります

_// sets up activity toolbar
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

myToolbar.showOverflowMenu();
myToolbar.setTitleTextColor(R.color.lightPrimaryText);
_

メニューxmlファイルをonCreateOptionsMenu()から膨らませてみましたが、それでも望んだ結果が得られませんでした。

22
JCLaHoot

res/menuリソースフォルダーで、MenuToolbarを定義します。例:

toolbar_menu.xml

_<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context=".activity.MainActivity">

    <item
        Android:id="@+id/action_sign_out"
        Android:title="@string/toolbar_sign_out"
        app:showAsAction="never"/>
</menu>
_

_app:showAsAction="never"_を設定すると、このMenuItemToolbarに表示されず、代わりにオーバーフローメニューに配置されます。

Activityのテーマは、NoActionBarテーマ(_Theme.AppCompat.NoActionBar_のいずれか、または使用する場合は_Theme.MaterialComponents.NoActionBar_のいずれか(または派生)でなければなりません 材料成分 )。

Activityで、Toolbarを設定します。

_Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
_

onCreateOptionsMenu()をオーバーライドして、以前に定義したメニューリソースを膨張させます。

_@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.toolbar_menu, menu);
    return true;
}
_

onOptionsItemSelected()をオーバーライドして、MenuItem(s)のonClick動作を定義できます。

_@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_sign_out: {
            // do your sign-out stuff
            break;
        }
        // case blocks for other MenuItems (if any)
    }
    return true;
}
_
45
earthw0rmjim

マニフェストファイルで宣言

Android:theme="@style/AppTheme.NoActionBar"

このような :

<activity
    Android:name=".ActivityName"
    Android:label="@string/label"
    Android:theme="@style/AppTheme.NoActionBar" />

これをあなたのスタイルに追加してください:

 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

activity onCreate()でこれを呼び出します:

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

アクティビティでこのメソッドをオーバーライドします。

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.product_list, menu);
    //U can find item set icon and stuff...
    MenuItem item= menu.findItem(R.id.action_search);

    return true;
}

オーバーフローメニューの場合、次のようにメニューを宣言します。

  <?xml version="1.0" encoding="utf-8"?>
<menu >
    <group>
        <item
            Android:id="@+id/sign_out"
            Android:title="@string/sign_out" />
        <item
            Android:id="@+id/about"
            Android:title="@string/about" />
    </group>
</menu>

ハンドル項目の選択については、これを呼び出します

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) { 
       case R.id.sign_out:
       //do stuff
           break;
           }  
        return super.onOptionsItemSelected(item);
    }

完了:)

2
f4rz4m1995