Manejo de un evento de clic de elemento de menú - Android

123

Quiero crear una intención que comience una nueva actividad una vez que se haga clic en un elemento del menú, pero no estoy seguro de cómo hacerlo. He estado leyendo la documentación de Android, pero mi implementación no es correcta ... y ayudaría un poco de orientación en la dirección correcta. He enumerado mi código a continuación y he comentado mis áreas problemáticas, creo que estoy invocando el método incorrecto.

package com.jbsoft.SimpleFlashlight;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.*;
import android.view.MenuItem.OnMenuItemClickListener;
import android.widget.Button;
import android.widget.Toast;

public class SimpleFlashLightActivity extends Activity {


  Button GreenButton;   // Declare instances of buttons to use later
  Button BlueButton;

  private static final int OK_MENU_ITEM = Menu.FIRST;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    BlueButton = (Button) findViewById(R.id.bluebutton);
    BlueButton.setOnClickListener(new View.OnClickListener() {

      public void onClick(View v) {

        //Display msg when user clicks Blue Button
        showColorChangeMsg();

        // Switch Activities on click
        Intent blueintent = new Intent(SimpleFlashLightActivity.this,
                                       BlueFlashLightActivity.class);
        startActivity(blueintent);

      }
    });
    //Install listener for second button
    GreenButton = (Button) findViewById(R.id.greenbutton);
    GreenButton.setOnClickListener(new View.OnClickListener() {

      public void onClick(View v) {

        // Display msg when user clicks Green Button
        showColorChangeMsg();

        Intent greenintent = new        Intent(SimpleFlashLightActivity.this,
                                               GreenFlashLightActivty.class);
        startActivity(greenintent);

      }
    });

    ;

    /**************************************************************************************/

    // Method Declarations // THIS IS WHERE I'M HAVING A PROBLEM

    MenuItem AddColorButton = (MenuItem)findViewById(R.id.menu_insert);

    boolean onOptionsItemSelected(AddColorButton) {
      Intent intent = new  Intent(SimpleFlashLightActivity.this,
                                  BlueFlashLightActivity.class);
      startActivity(intent);
      return true;
      ;
    };
    /****************************************************************************************/

  }
  private void showColorChangeMsg()
  {
    Toast msgtoast = Toast.makeText(this.getBaseContext(), "SWITCH COLOR!",
                                    Toast.LENGTH_LONG);
    msgtoast.show();
  }
  private void showMsg(String msg) {
    Toast toast = Toast.makeText(this, msg, Toast.LENGTH_LONG);
    toast.show();
  }

  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;

  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case OK_MENU_ITEM:
      showMsg("OK");
      break;
    }
    return super.onOptionsItemSelected(item);
  }

}
Jade Byfield
fuente

Respuestas:

297

código simple para crear menú ...

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

código simple para el menú seleccionado

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.new_game:
        newGame();
        return true;
    case R.id.help:
        showHelp();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

para más detalles ir debajo del enlace ..

Enlace1

Link2

Niranj Patel
fuente
¿El atributo android: onClick no funciona en este caso si tuviera que poner eso en el XML? (Programador de Android muy principiante aquí)
FateNuller
@FateNuller onClick dentro de XML para el menú de opciones no funcionaría, funcionaría para diseños. Debe manejar los clics del menú de opciones de la barra de acciones dentro de OnOptionsItemSelected.
Marko
Expresión constante requerida. Las ID de recursos no se pueden usar en una declaración de cambio en los módulos de biblioteca de Android menos ... Valida el uso de ID de recursos en una declaración de cambio en el módulo de biblioteca de Android. Las ID de recursos no son definitivas en los proyectos de la biblioteca, ya que las herramientas SDK r14 significan que el código de la biblioteca no puede tratar estas ID como constantes.
Zon
13

Agregar código siguiente

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.new_item:
        Intent i = new Intent(this,SecondActivity.class);
            this.startActivity(i);
            return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
Media Luna
fuente
5

El archivo de elementos del menú se ve así

res / menu / menu_main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/settings"
        android:title="Setting"
        app:showAsAction="never" />
    <item
        android:id="@+id/my_activity"
        android:title="My Activity"
        app:showAsAction="always"
        android:icon="@android:drawable/btn_radio"/>
</menu>

El código Java se parece a

src / MainActivity.java

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

      if (id == R.id.my_activity) {
            Intent intent1 = new Intent(this,MyActivity.class);
            this.startActivity(intent1);
            return true;
        }

        if (id == R.id.settings) {
            Toast.makeText(this, "Setting", Toast.LENGTH_LONG).show();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

Y agregue el siguiente código a su archivo AndroidManifest.xml

<activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
        </activity>

Espero que te ayude.

Pacific P. Regmi
fuente
3

Este código es trabajo para mi

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

     if (id == R.id.action_settings) {
  // add your action here that you want
        return true;
    }

    else if (id==R.id.login)
     {
         // add your action here that you want
     }


    return super.onOptionsItemSelected(item);
}
Basant
fuente
1

Además de las opciones que se muestran en su pregunta, existe la posibilidad de implementar la acción directamente en su archivo xml desde el menú, por ejemplo:

<item
   android:id="@+id/OK_MENU_ITEM"
   android:onClick="iraActivitySobre" />

Y para su archivo Java (Actividad), debe implementar un método público con un solo parámetro de tipo MenuItem, por ejemplo:

 private void showMsgDirectMenuXml(MenuItem item) {
    Toast toast = Toast.makeText(this, "OK", Toast.LENGTH_LONG);
    toast.show();
  }

NOTA: Este método tendrá un comportamiento similar al onOptionsItemSelected (elemento MenuItem)

Jackson.Roberio
fuente
0

Reemplace su onOptionsItemSelectedcomo:

  @Override
          public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
              case OK_MENU_ITEM:
                 startActivity(new Intent(DashboardActivity.this, SettingActivity.class));
                 break;

            // You can handle other cases Here.
              default: 
                 super.onOptionsItemSelected(item);
            }
          }

Aquí, quiero navegar de DashboardActivity a SettingActivity.

Dinesh Kc
fuente