Cómo configurar el menú en la barra de herramientas en Android

96

¡Quiero usar en ToolBarlugar de ActionBar, pero no me muestre el menú en la barra de herramientas! Quiero establecer un menú como Actualizar o Configurar botones en ActionBar.

ingrese la descripción de la imagen aquí

Código 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"/>

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>

¿Cómo solucionar este problema y mostrar el menú en Toolbar? gracias a todos los queridos <3

Dr.NoBody
fuente
4
Puede consultar aquí: stackoverflow.com/questions/31231609/…
Chol
2
Esto es lo que me faltaba toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych
Intente crear una nueva aplicación usando Android Studioy compruébelo. 'ToolBar' no debería ser una entidad independiente.
Abhinav Saxena

Respuestas:

154

simplemente anule onCreateOptionsMenu así en su 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
fuente
66

No use setSupportActionBar (barra de herramientas)

No sé por qué, pero esto funciona para mí.

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

Para el elemento del menú, haga clic en hacer esto

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

Actualizaré la parte del 'por qué' de esta respuesta cuando encuentre una explicación adecuada.
Feliz de ayudar de todos modos :) Paz.

Rohit Singh
fuente
5
Tu respuesta me alarma, pero no explica por qué no debería usarlo.
Richard Rout
5
Debe explicar por qué no usar setSupportActionBar (barra de herramientas) en lugar de simplemente decir lo que funciona para usted.
Vinicius Victor
1
Esto es lo único que funcionó para mí. Estoy usando Xamarin.Android con una barra de herramientas personalizada.
Washington A. Ramos
1
Leeré más sobre esto y actualizaré la respuesta @AbhinavSaxena. Buena llamada
Rohit Singh
Publique también main_activity_layout.xml. Esto funciona y es una solución excelente, pero debe completar la respuesta. Descanso lo he hecho en mi respuesta.
Abhinav Saxena
51

Aquí hay una respuesta más completa como referencia para futuros visitantes. Normalmente uso una barra de herramientas de soporte, pero funciona igual de bien de cualquier manera.

ingrese la descripción de la imagen aquí

1.Haz un menú xml

Esto va a estar en res/menu/main_menu.

  • Haga clic derecho en la rescarpeta y elija Nuevo> Archivo de recursos de Android .
  • Escriba main_menuel nombre del archivo.
  • Elija Menú para el tipo de recurso.

Pegue el siguiente contenido como iniciador.

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

Puede hacer clic con el botón derecho resy elegir Nuevo activo de imagen para crear el ic_addicono.

2. Inflar el menú

En su actividad agregue el siguiente método.

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

3. Controlar los clics del menú

También en su Actividad, agregue el siguiente 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);
    }
}

Otras lecturas

Suragch
fuente
4
Gracias por mostrar todos los componentes necesarios juntos, en lugar de solo dos líneas de código.
Big_Chair
44

Necesita anular este código en su actividad:

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

y configura tu barra de herramientas así:

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

También necesita esto, para implementar alguna acción en todas las opciones del menú.

@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
fuente
3

Aunque estoy de acuerdo con esta respuesta, ya que tiene menos líneas de código y funciona:

Cómo configurar el menú en la barra de herramientas en Android

Mi sugerencia sería comenzar siempre cualquier proyecto usando el Asistente de Android Studio. En ese código encontrarás algunos estilos: -

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

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

y el uso es:

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

Debido a no action bar themedeclarado en styles.xml, que se aplica al Main Activityen el AndroidManifest.xml, no hay excepciones, por lo que hay que comprobarlo allí.

<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. No Toolbares una entidad independiente, siempre es una vista secundaria en la AppBarLayoutque de nuevo es hija de CoordinatorLayout.
  2. El código para crear un menú es el código estándar desde el primer día, que se repite una y otra vez en todas las respuestas, particularmente en la marcada, pero nadie se dio cuenta de cuál es la diferencia.

AMBOS:

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

Y:

Cómo configurar el menú en la barra de herramientas en Android

TRABAJARÁ.

Codificación feliz :-)

Abhinav Saxena
fuente
2

En su actividad, anule este método.

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

Esto inflará su menú a continuación:

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

En mi caso, estoy usando un AppBarLayout con CollapsingToolbarLayout y el menú siempre se desplazaba fuera de la pantalla, resolví mi problema cambiando android: actionLayout en el XML del menú a la identificación de la barra de herramientas. ¡Espero que pueda ayudar a personas en la misma situación!

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

Solución simple a este se ponía showAsActiona alwaysen menu.xmlen res / menú

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

Bueno, necesitas configurar la barra de acción de soporte setSupportActionBar (); y pasa tu variable, así:setSupportActionBar(toolbar);

Kalaiyo5
fuente
0

En XML, agregue una línea dentro <Toolbar/>

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

En el archivo java, reemplace esto:

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

con este:

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

Aún puede usar la respuesta proporcionada usando Toolbar.inflateMenu incluso mientras usa setSupportActionBar (barra de herramientas).

Tuve un escenario en el que tuve que mover la funcionalidad de configuración de la barra de herramientas a una clase separada fuera de la actividad que por sí sola no conocía el evento enCreateOptionsMenu.

Entonces, para implementar esto, todo lo que tuve que hacer fue esperar a que se dibujara la barra de herramientas antes de llamar a inflateMenu haciendo lo siguiente:

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

Puede que no se considere muy limpio, pero aún así hace el trabajo.

Mohib Irshad
fuente