Cara mengatur menu ke Toolbar di Android

99

Saya ingin menggunakan ToolBarbukan ActionBar, tetapi tidak menunjukkan menu di toolbar !!! Saya ingin mengatur menu seperti tombol Refresh atau Pengaturan masuk ActionBar.

masukkan deskripsi gambar di sini

Kode Toolbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:navigationContentDescription="@string/abc_action_bar_up_description"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:title="Main Page"
    android:gravity="center"/>

Kode MainPage.java:

public class MainPage extends AppCompatActivity {
    private Toolbar toolbar;

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

        toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("Main Page");
        }
        toolbar.setSubtitle("Test Subtitle");
        toolbar.inflateMenu(R.menu.main_manu);
    }
}

kode main_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">

    <item
        android:id="@+id/menu_main_setting"
        android:icon="@drawable/ic_settings"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:actionLayout="@layout/toolbar"
        android:title="Setting" />

    <item
        android:id="@+id/menu_main_setting2"
        android:icon="@drawable/ic_settings"
        android:orderInCategory="200"
        app:showAsAction="always"
        android:actionLayout="@layout/toolbar"
        android:title="Setting" />

</menu>

Bagaimana cara memperbaiki masalah ini dan menampilkan menu Toolbar? terima kasih semua sayangku <3

Dr. NoBody
sumber
4
Anda dapat memeriksa di sini: stackoverflow.com/questions/31231609/…
Chol
3
Dan lebih baik dari google: developer.android.com/training/appbar/setting-up.html
Chol
2
Inilah yang saya lewatkan toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych
Coba buat aplikasi baru menggunakan Android Studiodan periksa. 'ToolBar' tidak boleh merupakan entitas independen.
Abhinav Saxena

Jawaban:

158

cukup timpa onCreateOptionsMenu seperti ini di MainPage.java Anda

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}
Keyur
sumber
69

Jangan gunakan setSupportActionBar (toolbar)

Saya tidak tahu mengapa tetapi ini berhasil untuk saya.

toolbar = (Toolbar) findViewById(R.id.main_toolbar);
toolbar.setSubtitle("Test Subtitle");
toolbar.inflateMenu(R.menu.main_manu);

Untuk item menu klik lakukan ini

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {

            if(item.getItemId()==R.id.item1)
            {
                // do something
            }
            else if(item.getItemId()== R.id.filter)
            {
               // do something
            }
            else{
               // do something
            }

            return false;
        }
    });

Akan memperbarui bagian 'mengapa' dari jawaban ini ketika saya menemukan penjelasan yang tepat.
Senang bisa membantu :) Damai.

Rohit Singh
sumber
5
Anda menjawab alarm saya, tetapi itu tidak menjelaskan mengapa saya tidak boleh menggunakannya.
Richard Rout
5
Anda harus menjelaskan mengapa tidak menggunakan setSupportActionBar (toolbar) daripada hanya mengatakan apa yang berhasil untuk Anda.
Vinicius Victor
1
Ini adalah satu-satunya hal yang berhasil untuk saya. Saya menggunakan Xamarin.Android dengan Toolbar kustom.
Washington A. Ramos
1
Saya akan membaca lebih lanjut tentang itu dan memperbarui jawaban @AbhinavSaxena. Panggilan yang bagus
Rohit Singh
Silakan posting main_activity_layout.xml juga. Ini berfungsi dan merupakan solusi luar biasa, tetapi Anda harus menyelesaikan jawabannya. Istirahat yang telah saya lakukan dalam jawaban saya.
Abhinav Saxena
53

Berikut adalah jawaban yang lebih lengkap sebagai referensi untuk pengunjung selanjutnya. Saya biasanya menggunakan toolbar dukungan tetapi berfungsi dengan baik.

masukkan deskripsi gambar di sini

1. Buat menu xml

Ini akan masuk res/menu/main_menu.

  • Klik kanan resfolder dan pilih New> Android Resource File .
  • Tipe main_menu nama File.
  • Pilih Menu untuk jenis Sumber Daya.

Tempel konten berikut sebagai permulaan.

<?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/action_add"
        android:icon="@drawable/ic_add"
        app:showAsAction="ifRoom"
        android:title="Add">
    </item>
    <item
        android:id="@+id/action_settings"
        app:showAsAction="never"
        android:title="Settings">
    </item>
</menu>

Anda dapat mengklik kanan resdan memilih Aset gambar baru untuk membuat fileic_add ikon.

2. Tingkatkan menu

Dalam aktivitas Anda, tambahkan metode berikut.

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

3. Tangani klik menu

Juga di Aktivitas Anda, tambahkan metode berikut:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.action_add:
            addSomething();
            return true;
        case R.id.action_settings:
            startSettings();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Bacaan lebih lanjut

Suragch
sumber
5
Terima kasih telah menampilkan semua komponen yang diperlukan secara bersamaan, bukan hanya dua baris kode.
Big_Chair
44

Anda perlu mengganti kode ini dalam Aktivitas Anda:

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

dan setel bilah alat Anda seperti ini:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Parth Anjaria
sumber
7

Anda juga membutuhkan ini, untuk menerapkan beberapa tindakan ke setiap opsi menu.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_help:
            Toast.makeText(this, "This is teh option help", Toast.LENGTH_LONG).show();
            break;
        default:
            break;
    }
    return true;
}
Liliana J
sumber
3

Meskipun saya setuju dengan jawaban ini, karena memiliki lebih sedikit baris kode dan berfungsi:

Cara mengatur menu ke Toolbar di Android

Saran saya adalah selalu memulai proyek apa pun menggunakan Android Studio Wizard. Dalam kode itu Anda akan menemukan beberapa gaya: -

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

dan penggunaannya adalah:

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout> 

Karena no action bar themedideklarasikan di styles.xml, yang diterapkan ke Main Activitydalam AndroidManifest.xml, tidak ada pengecualian, jadi Anda harus memeriksanya di sana.

<activity android:name=".MainActivity" android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  1. Itu Toolbarbukan entitas independen, itu selalu merupakan tampilan anak AppBarLayoutyang lagi-lagi adalah anak dari CoordinatorLayout.
  2. Kode untuk membuat menu adalah kode standar sejak hari pertama, yang diulangi lagi dan lagi di semua jawaban, terutama yang ditandai, tetapi tidak ada yang menyadari apa bedanya.

KEDUA:

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

DAN:

Cara mengatur menu ke Toolbar di Android

AKAN BEKERJA.

Selamat Coding :-)

Abhinav Saxena
sumber
2

Dalam aktivitas Anda, timpa metode ini.

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

Ini akan meningkatkan menu Anda di bawah ini:

 <?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/menu_main_setting"
            android:icon="@drawable/ic_settings"
            android:orderInCategory="100"
            app:showAsAction="always"
            android:actionLayout="@layout/toolbar"
            android:title="Setting" />

        <item
            android:id="@+id/menu_main_setting2"
            android:icon="@drawable/ic_settings"
            android:orderInCategory="200"
            app:showAsAction="always"
            android:actionLayout="@layout/toolbar"
            android:title="Setting" />

    </menu>
Khemraj
sumber
2

Anda masih dapat menggunakan jawaban yang disediakan menggunakan Toolbar.inflateMenu bahkan saat menggunakan setSupportActionBar (toolbar).

Saya memiliki skenario di mana saya harus memindahkan fungsionalitas pengaturan bilah alat ke kelas terpisah di luar aktivitas yang tidak dengan sendirinya mengetahui acara onCreateOptionsMenu.

Jadi, untuk menerapkan ini, yang harus saya lakukan hanyalah menunggu Toolbar digambar sebelum memanggil inflateMenu dengan melakukan hal berikut:

toolbar.post {
    toolbar.inflateMenu(R.menu.my_menu)
}

Mungkin tidak dianggap sangat bersih tetapi masih menyelesaikan pekerjaan.

Mohib Irshad
sumber
ini berhasil untuk saya. Terima kasih!
raquezha
1

Dalam kasus saya, saya menggunakan AppBarLayout dengan CollapsingToolbarLayout dan menu selalu digulir keluar dari layar, saya memecahkan masalah saya dengan mengalihkan android: actionLayout dalam XML menu ke id toolbar. Saya harap ini dapat membantu orang-orang dalam situasi yang sama!

activity_main.xml

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:fab="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.MainScreenActivity"
    android:screenOrientation="portrait">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="exitUntilCollapsed|scroll"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="48dp"
            >
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:elevation="0dp"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                app:layout_collapseMode="pin"/>
        </android.support.design.widget.CollapsingToolbarLayout>


    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

main_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">
    <item
        android:id="@+id/logoutMenu"
        android:orderInCategory="100"
        android:title="@string/log_out"
        app:showAsAction="never"
        android:actionLayout="@id/toolbar"/>
    <item
        android:id="@+id/sortMenu"
        android:orderInCategory="100"
        android:title="@string/sort"
        app:showAsAction="never"/> </menu>
Natan Rincker
sumber
1

Dalam XML tambahkan satu baris di dalamnya <Toolbar/>

<com.google.android.material.appbar.MaterialToolbar
app:menu="@menu/main_menu"/>

Dalam file java, ganti ini:

 setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("Main Page");
        }

dengan ini:

toolbar.setTitle("Main Page")
bhanwar
sumber
0

Memperbaiki sederhana untuk ini terbenam showAsActionke alwaysdalam menu.xmldi res / menu

<?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/add_alarm"
        android:icon="@drawable/ic_action_name"
        android:orderInCategory="100"
        android:title="Add"
        app:showAsAction="always"
        android:visible="true"/>

</menu>
Windula Kularatne
sumber
0
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar;        
    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
  }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_drawer,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_drawer){
           drawerLayout.openDrawer(GravityCompat.END);
            if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
                drawerLayout.closeDrawer(GravityCompat.END);
            } else {
                drawerLayout.openDrawer(GravityCompat.END);
            }
        }
        return super.onOptionsItemSelected(item);
    }

res / layout / drawer_menu

<?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/action_drawer"
        android:title="@string/app_name"
        android:icon="@drawable/ic_menu_black_24dp"
        app:showAsAction="always"/>

</menu>

toolbar.xml

<com.google.android.material.appbar.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:titleTextColor="@android:color/white"
    app:titleTextAppearance="@style/TextAppearance.Widget.Event.Toolbar.Title">

     <TextView
         android:id="@+id/toolbar_title"
         android:layout_gravity="center"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/app_name"
         android:textColor="@android:color/white"
         style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" />

</androidx.appcompat.widget.Toolbar>

Meysam Keshvari
sumber
0
private Toolbar toolbar;

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

    toolbar = (Toolbar) findViewById(R.id.my_toolbar);
    *// here is where you set it to show on the toolbar*
    setSupportActionBar(toolbar);
}

Nah, Anda perlu menyetel bilah tindakan dukungan setSupportActionBar (); dan berikan variabel Anda, seperti:setSupportActionBar(toolbar);

Kalaiyo5
sumber