Como definir o menu para barra de ferramentas no Android

96

Quero usar em ToolBarvez de ActionBar, mas não me mostre o menu na barra de ferramentas !!! desejo definir o menu, como os botões Atualizar ou ConfiguraçõesActionBar .

insira a descrição da imagem aqui

Código da barra de ferramentas.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"/>

Código 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);
    }
}

código 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>

Como resolver esse problema e mostrar o menu no Toolbar? obrigado todos queridos <3

Dr.NoBody
fonte
4
Você pode verificar aqui: stackoverflow.com/questions/31231609/…
Chol
2
Isso é o que estava faltando. Toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych
Tente criar um novo aplicativo usando Android Studioe verifique. `ToolBar 'não deve ser uma entidade independente.
Abhinav Saxena

Respostas:

154

apenas substitua onCreateOptionsMenu como este em seu 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
fonte
66

Não use setSupportActionBar (barra de ferramentas)

Eu não sei por que, mas isso funciona para mim.

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

Para o item de menu, clique em fazer isso

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

Atualizarei a parte 'por que' dessa resposta quando eu encontrar uma explicação adequada.
Fico feliz em ajudar de qualquer maneira :) Paz.

Rohit Singh
fonte
5
Sua resposta me alarma, mas não explica por que não devo usá-lo.
Richard Rout,
5
Você deve explicar por que não usar setSupportActionBar (barra de ferramentas) em vez de apenas dizer o que funciona para você.
Vinicius Victor
1
Esta é a única coisa que funcionou para mim. Estou usando o Xamarin.Android com uma barra de ferramentas personalizada.
Washington A. Ramos
1
Vou ler mais sobre isso e atualizar a resposta @AbhinavSaxena. Boa chamada
Rohit Singh
Publique o main_activity_layout.xml também. Isso funciona e é uma solução excelente, mas você tem que completar a resposta. O resto já fiz na minha resposta.
Abhinav Saxena
51

Aqui está uma resposta completa como referência para futuros visitantes. Eu costumo usar uma barra de ferramentas de suporte, mas funciona bem de qualquer maneira.

insira a descrição da imagem aqui

1. Faça um menu xml

Isso vai entrar res/menu/main_menu.

  • Clique com o botão direito na respasta e escolha Novo> Arquivo de recursos Android .
  • Digite main_menuo nome do arquivo.
  • Escolha o menu para o tipo de recurso.

Cole o seguinte conteúdo para começar.

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

Você pode clicar com o botão direito rese escolher Novo ativo de imagem para criar o ic_addícone.

2. Inflar o menu

Em sua atividade, adicione o seguinte método.

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

3. Lidar com cliques de menu

Também em sua atividade, adicione o seguinte método:

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

Leitura adicional

Suragch
fonte
4
Obrigado por realmente mostrar todos os componentes necessários juntos, em vez de apenas duas linhas de código.
Big_Chair
44

Você precisa substituir este código em sua atividade:

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

e defina sua barra de ferramentas assim:

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

Você também precisa disso para implementar alguma ação em todas as opções do 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
fonte
3

Embora eu concorde com essa resposta, pois tem menos linhas de código e funciona:

Como definir o menu para barra de ferramentas no Android

Minha sugestão seria sempre iniciar qualquer projeto usando o Android Studio Wizard. Nesse código você encontrará alguns estilos: -

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

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

e o uso é:

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

Devido a no action bar themedeclarado em styles.xml, que se aplica ao Main Activityem AndroidManifest.xml, não há exceções, então você tem que verificar lá.

<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. O Toolbarnão é uma entidade independente, é sempre uma visão filha e, AppBarLayoutnovamente, é filha de CoordinatorLayout.
  2. O código para a criação de um menu é o código padrão desde o primeiro dia, que se repete continuamente em todas as respostas, principalmente na marcada, mas ninguém percebeu qual é a diferença.

AMBOS:

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

E:

Como definir o menu para barra de ferramentas no Android

IRÁ FUNCIONAR.

Happy Coding :-)

Abhinav Saxena
fonte
2

Em sua atividade, substitua este método.

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

Isso vai aumentar seu menu abaixo:

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

No meu caso, estou usando um AppBarLayout com um CollapsingToolbarLayout e o menu estava sempre sendo rolado para fora da tela, resolvi meu problema trocando android: actionLayout no XML do menu para o id da barra de ferramentas. Espero que possa ajudar pessoas na mesma situação!

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

Solução simples para isso foi a criação showAsActionde alwaysno menu.xmlno 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
fonte
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
fonte
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);
}

Bem, você precisa definir a barra de ação de suporte setSupportActionBar (); e passe sua variável, assim:setSupportActionBar(toolbar);

Kalaiyo5
fonte
0

Em XML, adicione uma linha dentro <Toolbar/>

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

No arquivo java, substitua este:

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

com isso:

toolbar.setTitle("Main Page")
Bhanwar
fonte
0

Você ainda pode usar a resposta fornecida usando Toolbar.inflateMenu mesmo enquanto usa setSupportActionBar (barra de ferramentas).

Tive um cenário em que tive que mover a funcionalidade de configuração da barra de ferramentas para uma classe separada, fora da atividade, que por si só não sabia do evento onCreateOptionsMenu.

Então, para implementar isso, tudo que eu tive que fazer foi esperar que a Barra de Ferramentas fosse desenhada antes de chamar inflateMenu fazendo o seguinte:

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

Pode não ser considerado muito limpo, mas ainda assim dá conta do recado.

Mohib Irshad
fonte