Bilah Alat Android Menambahkan Item Menu untuk berbagai fragmen

90

Saya memiliki bilah alat serta laci navigasi. Saat saya memulai aplikasi saya, bilah alat dan panel samping navigasi dibuat. Saat saya mengklik item di panel samping navigasi, fragmen baru akan dimulai dan toolbar tetap sama. Bagaimana saya pada dasarnya menambahkan item menu ke toolbar seperti pencarian, tambah, edit ketika saya memulai fragmen tertentu? Saya tidak ingin mereka di awal program, tetapi dibuat secara dinamis. Juga, bagaimana saya bisa mengklik tombol-tombol ini dan meminta mereka memulai fragmen lain. Saya menginginkannya dalam satu fragmen, tombol edit di toolbar melakukan hal tertentu dibandingkan tombol edit di fragmen lain. Terima kasih!

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

Toolbar:

<?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"
/>
Joe Eigi
sumber

Jawaban:

168

Tambahkan kode serupa ke fragmen Anda:

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

Dengan cara ini Anda dapat menyesuaikan menu untuk fragmen Anda.

Gundu Bandgar
sumber
19
Ini adalah jawaban yang benar karena panggilan ke setHasOptionsMenu (true) diperlukan untuk memanggil metode onCreateOptionsMenu dalam fragmen.
John Slavick
15
Ingat menelepon menu.clear()di onCreateOptionsMenu- jika tidak Anda akan mewarisi menu dari orangtua, juga.
Dart Dega
@DartDega di mana saya meletakkan kode untuk menghapus? Fragmen atau Aktivitas Pak, saya tidak melihat menuitem di fragmen saya
famfamfam
Apakah ini berfungsi dengan API level 28? Saya masih melihat item menu aktivitas utama
ArdenDev
33

Beginilah cara membuat menu secara dinamis: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Diedit:

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);
Allen Chan
sumber
4
digunakan actionBarToolbar.setOnMenuItemClickListener()untuk menangani tindakan item menu. onOptionsItemSelected()tidak dipanggil dalam situasi ini.
Lahiru Chandima
2
tautan yang diberikan tidak lebih
Ashvin solanki
25

Cara terbaik untuk melakukannya:

1. Temukan toolbar di Activity dan setel sebagai supportActionBar.

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

2. Maka akan menjadi sangat mudah untuk menangani menu opsi untuk fragmen yang berbeda di atas Aktivitas yang sama. Lakukan hal-hal berikut di setiap fragmen sesuai keinginan Anda:

Dalam panggilan Metode OnCreateView

setHasOptionsMenu(true);

Dan terakhir,

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

Dan untuk mengelola item menu klik, kami memiliki 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);
    }
}
Prateek Gupta
sumber
1
setHasOptionsMenu (true) sangat membantu! Terima Kasih
J. Dragon
10

Ganti onCreateOptionsMenumetode di setiap fragmen Anda.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Ellie Zou
sumber
@JoeEigi Mengapa Anda menginginkan toolbar yang berbeda? Anda dapat mengatur judul dan menu yang berbeda.
Ellie Zou
@JoeEigi ya, Anda dapat memiliki menu kustom dengan menggembungkan menu kustom xml. Panggilan setTitle()dapat menambahkan judul.
Ellie Zou
@JoeEigi Sepertinya Anda mendapat konteks yang salah, lihat ini: stackoverflow.com/questions/26998455/…
Allen Chan
1
Saya mematikan bilah tindakan di manifes saya, tetapi masih muncul di tata letak aktivitas saya di atas bilah alat. Bagaimana cara menyingkirkan ini
Joe Eigi
Ya, melakukan itu dan masih muncul di tata letak saya tetapi tidak terlihat
Joe Eigi
4

Saya memecahkan masalah ini dengan benar. Solusi saya adalah sebagai kode berikut:

@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);
}
Hai Rom
sumber
Ya, saya menunjukkan menu dengan benar. Tetapi cara menyembunyikan menu ini pada tutup fragmen, maksud saya Ketika kita beralih ke fragmen lain misalnya dari a -> b, menu a masih terlihat di toolbar fragmen b.
Zeeshan Ahmed
gunakan setHasOptionsMenu (false) di onCreateView dari fragmen b.
Kannan_SJD
4

Saya memiliki masalah yang sama dan saya ingin mengganti menu toolbar sesuai dengan fragmen yang ditampilkan.

Masalah yang saya hadapi sekarang adalah menu ditambahkan ke yang sebelumnya.

Untuk hanya menampilkan menu untuk fragmen, saya sarankan:

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

Semoga bisa membantu.

Matteo Gariglio
sumber
2
cukup periksa apakah menu! = null sebelum menelepon ke .clear ()
mapo
2

Berikut adalah langkah-langkah untuk menampilkan opsi menu berbeda dengan fragmen berbeda.

Langkah1: Panggil setHasOptionsMenu (true)

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

    }

Langkah2: Tingkatkan item menu opsi terkait fragmen Anda.

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)
}
takharsh
sumber
Ini membantu saya untuk menghapus tombol menu yang tidak diinginkan yang muncul di menu baru saya
Im Batman
1

Di dalam XML tambahkan baris ini

app:menu="@menu/main_menu"
AbdelraZek
sumber
1
Sebenarnya kamu benar! Anda bisa menentukannya dengan xml lalu di fragmen: `` `override fun onViewCreated (view: View, storedInstanceState: Bundle?) {Super.onViewCreated (view, storedInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView as SearchView searchView.setOnQueryTextListener (this)} ``
user3193413
0

Menggunakan MaterialToolbar baru , sangat mudah untuk membuat menu tambahan dan digunakan untuk:

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

dan kemudian dalam kode untuk mengatur Pendengar OnCLick cukup tambahkan ini:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Amin Keshavarzian
sumber