Androidツールバーさまざまなフラグメントのメニュー項目を追加する


89

ツールバーとナビゲーションドロワーがあります。アプリを起動すると、ツールバーとナビゲーションドロワーが作成されます。ナビゲーションドロワーのアイテムをクリックすると、新しいフラグメントが開始され、同じツールバーが維持されます。特定のフラグメントを開始するときに、検索、追加、編集などのメニュー項目をツールバーに基本的に追加するにはどうすればよいですか?プログラムの開始時には必要ありませんが、動的に作成されます。また、これらのボタンをクリックして、他のフラグメントを開始させるにはどうすればよいでしょうか。あるフラグメントでは、ツールバーの編集ボタンが別のフラグメントの編集ボタンと比較して特定のことを実行するようにしたいのです。ありがとう!

Menu_toolbar:

<?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">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

ツールバー:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>

回答:


167

フラグメントに同様のコードを追加します。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.library_fragment, parent, false);
    setHasOptionsMenu(true);
    return v;
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   inflater.inflate(R.menu.your_menu_xml, menu);
   super.onCreateOptionsMenu(menu, inflater);
}

このようにして、フラグメントのメニューをカスタマイズできます。


19
フラグメントで呼び出されるonCreateOptionsMenuメソッドにはsetHasOptionsMenu(true)の呼び出しが必要なため、これは正解です。
John Slavick 2016年

15
電話をかけることmenu.clear()を忘れonCreateOptionsMenuないでください。そうしないと、親からメニューを継承することになります。
ダートデガ2018年

@DartDegaどこにコードを入れてクリアしますか?フラグメントまたはアクティビティ先生、私は私のフラグメントにメニューアイテムを見ていないです
famfamfam

これはAPIレベル28で機能しますか?主なアクティビティメニュー項目がまだ表示されています
ArdenDev

33

メニューを動的に作成する方法は次のとおりです。http//www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

編集:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);

4
actionBarToolbar.setOnMenuItemClickListener()メニュー項目のアクションを処理するために使用します。onOptionsItemSelected()この状況では呼び出されません。
Lahiru Chandima 2017

2
与えられたリンクはもうありません
Ashvinsolanki19年

25

それを行うための最良の方法:

1.アクティビティでツールバーを見つけ、supportActionBarとして設定します。

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2.次に、同じアクティビティでさまざまなフラグメントのオプションメニューを処理するのは簡単です。必要に応じて、各フラグメントで次のことを行います。

OnCreateViewメソッドの呼び出しで

setHasOptionsMenu(true);

そして最後に、

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

メニュー項目のクリックを管理するために、onOptionsItemSelectedがあります。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}

1
setHasOptionsMenu(true)は本当に役に立ちます!Uありがとう
J.Dragon

10

onCreateOptionsMenuすべてのフラグメントのメソッドをオーバーライドします。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@JoeEigiなぜ別のツールバーが必要なのですか?さまざまなタイトルやメニューを設定できます。
Ellie Zou 2015年

@JoeEigiはい、カスタムメニューxmlを膨らませることでカスタムメニューを作成できます。通話でsetTitle()タイトルを追加できます。
Ellie Zou 2015年

@JoeEigi間違ったコンテキストを取得したようです、これを見てください:stackoverflow.com/questions/26998455/…–
Allen Chan

1
マニフェストでアクションバーをオフにしましたが、ツールバーの上のアクティビティレイアウトに表示されます。これを取り除くにはどうすればよいですか
Joe Eigi 2015年

はい、そうしましたが、レイアウトには表示されますが、表示されなくなります
Joe Eigi 2015年


4

私はこの問題を正しく解決しました。私の解決策は次のコードです:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

    return mRootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

はい、メニューを正しく表示しました。しかし、フラグメントを閉じるときにこのメニューを非表示にする方法は、たとえばa-> bから別のフラグメントに切り替えると、フラグメントbのツールバーにまだ表示されているメニューを意味します。
Zeeshan Ahmed 2016

フラグメントbのonCreateViewでsetHasOptionsMenu(false)を使用します。
Kannan_SJD 2017年

4

同じ問題が発生し、表示されたフラグメントに応じてツールバーメニューを置き換えたいと思いました。

私が今直面している問題は、メニューが前のメニューに追加されていることです。

フラグメントのメニューのみを表示するには、次のことをお勧めします。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

お役に立てば幸いです。


2
ちょうどメニューかどうかを確認=ヌルを.clearするために呼び出す前に()!
麻浦

2

以下は、さまざまなフラグメントを使用してさまざまなメニューオプションを表示する手順です。

ステップ1:setHasOptionsMenu(true)を呼び出す

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

ステップ2:フラグメント関連のオプションメニュー項目を膨らませます。

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

これは私の新しいメニューに登場し、不要なメニューボタン削除するために私に助けた
イムバットマン

1

XML内にこの行を追加します

app:menu="@menu/main_menu"

1
実際、あなたは正しいです!xmlで指定してから、フラグメントで指定できます: `` `override fun onViewCreated(view:View、savedInstanceState:Bundle?){super.onViewCreated(view、savedInstanceState)toolBar.setNavigationOnClickListener {activity?.onBackPressed()} searchView = SearchView searchView.setOnQueryTextListenerとしてtoolBar.menu.findItem(R.id.action_search).actionView(本)} `
user3193413

0

新しいMaterialToolbarを使用すると、オーバーフローメニューを作成し、次の目的で使用するのは非常に簡単です。

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

次に、OnCLickリスナーを設定するコードに次を追加します。

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