Jak ustawić menu na pasku narzędzi w systemie Android

99

Chcę używać ToolBarzamiast ActionBar, ale nie pokazuj mi menu na pasku narzędzi !!! Chcę ustawić menu, takie jak przyciski Odśwież lub Ustawienia w ActionBar.

wprowadź opis obrazu tutaj

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

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

kod 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>

Jak rozwiązać ten problem i wyświetlić menu Toolbar? dzięki wszystkim kochani <3

Dr NoBody
źródło
4
Możesz sprawdzić tutaj: stackoverflow.com/questions/31231609/ ...
Chol
2
Tego mi brakowało toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych
Spróbuj utworzyć nową aplikację za pomocą Android Studioi sprawdź ją. ToolBar nie powinien być niezależną jednostką.
Abhinav Saxena,

Odpowiedzi:

158

po prostu nadpisz onCreateOptionsMenu w ten sposób w swoim MainPage.java

@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
źródło
70

Nie używaj setSupportActionBar (pasek narzędzi)

Nie wiem dlaczego, ale to działa dla mnie.

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

Aby wyświetlić pozycję menu, kliknij zrób to

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

Zaktualizuję część „dlaczego” tej odpowiedzi, gdy znajdę właściwe wyjaśnienie.
Mimo wszystko chętnie pomogę :) Spokój.

Rohit Singh
źródło
5
Twoja odpowiedź mnie niepokoi, ale nie wyjaśnia, dlaczego nie powinienem jej używać.
Richard Rout
5
Powinieneś wyjaśnić, dlaczego nie używać setSupportActionBar (paska narzędzi), zamiast po prostu mówić, co działa w Twoim przypadku.
Vinicius Victor
1
To jedyna rzecz, która zadziałała dla mnie. Używam Xamarin.Android z niestandardowym paskiem narzędzi.
Washington A. Ramos
1
Przeczytam o tym więcej i zaktualizuję odpowiedź @AbhinavSaxena. Dobra rozmowa
Rohit Singh
Opublikuj również plik main_activity_layout.xml. To działa i jest znakomitym rozwiązaniem, ale musisz udzielić odpowiedzi. Reszta zrobiłem w mojej odpowiedzi.
Abhinav Saxena,
53

Oto pełniejsza odpowiedź jako odniesienie do przyszłych odwiedzających. Zwykle używam paska narzędzi wsparcia, ale działa to równie dobrze.

wprowadź opis obrazu tutaj

1. Utwórz menu xml

To będzie w środku res/menu/main_menu.

  • Kliknij resfolder prawym przyciskiem myszy i wybierz Nowy> Plik zasobów systemu Android .
  • Wpisz main_menunazwę pliku.
  • Wybierz opcję Menu dla typu zasobu.

Wklej następującą treść jako początek.

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

Możesz kliknąć prawym przyciskiem myszy resi wybrać Nowy zasób obrazu, aby utworzyć ic_addikonę.

2. Napompuj menu

W swojej aktywności dodaj następującą metodę.

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

3. Obsługuj kliknięcia menu

Również w swojej aktywności dodaj następującą metodę:

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

Dalsza lektura

Suragch
źródło
5
Dziękujemy za faktyczne pokazanie wszystkich niezbędnych komponentów razem, zamiast tylko dwóch wierszy kodu.
Big_Chair
44

Musisz zastąpić ten kod w swojej aktywności:

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

i ustaw swój pasek narzędzi w ten sposób:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Parth Anjaria
źródło
7

Jest to również potrzebne, aby zaimplementować jakąś akcję do każdej opcji 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.
źródło
3

Chociaż zgadzam się z tą odpowiedzią, ponieważ ma mniej linii kodu i działa:

Jak ustawić menu na pasku narzędzi w systemie Android

Moja sugestia byłaby taka, aby zawsze rozpoczynać projekt za pomocą kreatora Android Studio. W tym kodzie znajdziesz kilka stylów: -

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

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

a użycie to:

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

Ze względu na no action bar themezadeklarowane w styles.xml, które jest stosowane do Main Activityw AndroidManifest.xml, nie ma wyjątków, więc musisz to tam sprawdzić.

<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. Nie Toolbarjest niezależnym bytem, ​​jest zawsze dzieckiem, AppBarLayoutponieważ znowu jest dzieckiem CoordinatorLayout.
  2. Kod do tworzenia menu to standardowy kod od pierwszego dnia, który jest wielokrotnie powtarzany we wszystkich odpowiedziach, szczególnie w zaznaczonej, ale nikt nie zdawał sobie sprawy, jaka jest różnica.

OBIE:

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

I:

Jak ustawić menu na pasku narzędzi w systemie Android

BĘDZIE DZIAŁAĆ.

Miłego kodowania :-)

Abhinav Saxena
źródło
2

W swoim działaniu zastąp tę metodę.

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

Spowoduje to zawyżenie poniższego 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/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
źródło
2

W XML dodaj jedną linię w środku <Toolbar/>

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

W pliku java zamień to:

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

z tym:

toolbar.setTitle("Main Page")
bhanwar
źródło
2

Możesz nadal korzystać z odpowiedzi udzielonej za pomocą Toolbar.inflateMenu, nawet jeśli używasz setSupportActionBar (pasek narzędzi).

Miałem scenariusz, w którym musiałem przenieść funkcjonalność konfiguracji paska narzędzi do oddzielnej klasy poza działaniem, która sama nie wiedziała o zdarzeniu onCreateOptionsMenu.

Aby to zaimplementować, wszystko, co musiałem zrobić, to poczekać na narysowanie paska narzędzi przed wywołaniem inflateMenu, wykonując następujące czynności:

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

Może nie być uważany za bardzo czysty, ale nadal wykonuje swoją pracę.

Mohib Irshad
źródło
to działa dla mnie. Dzięki!
raquezha
1

W moim przypadku używam AppBarLayout z CollapsingToolbarLayout i menu było zawsze przewijane z ekranu, rozwiązałem swój problem, przełączając android: actionLayout w XML menu na identyfikator paska narzędzi. Mam nadzieję, że pomoże to ludziom w takiej samej sytuacji!

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
źródło
0

Prosty fix to chyliło showAsActionsię alwaysw menu.xmlw 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
źródło
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
źródło
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);
}

Cóż, musisz ustawić pasek akcji wsparcia setSupportActionBar (); i przekaż swoją zmienną, na przykład:setSupportActionBar(toolbar);

Kalaiyo5
źródło