¿Cómo anular el botón de retroceso de la barra de acción en Android?

95

Quiero personalizar el botón de retroceso de la actividad en la barra de acción, no en el botón de retroceso de la tecla física. He anulado el onBackPressed()método. Funciona con el botón de retroceso de mi emulador, pero no con el botón de retroceso de la barra de acción.

Quiero que suceda con la barra de acciones. ¿Cómo puedo hacer esto?

Aquí está mi código:

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

He usado este brindis, ya sea que el retroceso esté funcionando o no, pero la implementación real cambia, como volver a la actividad anterior. Pero esto no funciona con el botón presente en la parte superior de la barra de acciones (además del título de la actividad).

Por favor, cualquiera podría especificarme el problema.

G K
fuente

Respuestas:

210

Creo que desea anular la operación de clic del botón de inicio. Puede anular esta funcionalidad de esta manera en su actividad.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}
ibrahimyilmaz
fuente
1
Noah Ibrahim, en realidad hay un botón Atrás en la esquina superior izquierda como el botón Atrás en el navegador. Cuando hago clic en ese botón, quiero volver a la actividad anterior. No como el código que publicaste arriba.
GK
4
agregar super.onBackPressed (); to it
redestructa
2
Esto funcionó para mí después de cambiarme return true;a return super.onOptionsItemSelected(item). Luego, puede hacer que suceda algo cuando el usuario hace clic en el botón de retroceso de la barra de acciones, pero aún conserva la misma funcionalidad del botón.
kumaheiyama
Con esta técnica, el botón de flecha hacia atrás responde tarde. Significa que tengo que esperar un segundo para que se active el evento. Tampoco aparece el selector en este botón para el efecto mientras lo presiona
Gopal Singh Sirvi
No funcionó para mí. Cuando depuré, encontré los identificadores del botón de inicio y el identificador del botón pulsado diferente.
víbora
45

Si desea que el botón de retroceso de ActionBar se comporte de la misma manera que el botón de retroceso del hardware:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }
ruX
fuente
1
caso android.R.id.homeno dispara
Trancer
2
@Trancer si lo usa en Fragmento, también debe llamar setHasOptionsMenu(true)al método onCreate del fragmento
wilddev
10

Dos cosas a tener en cuenta: el usuario puede presionar el botón de retroceso o presionar el botón de inicio de la barra de acción.
Entonces, si desea redirigirlo al mismo destino, puede hacerlo.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return false;
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

Esto llevará al usuario a la intención presionando la tecla o el botón de la barra de acción.

ssi-anik
fuente
caso android.R.id.homeno dispara
Trancer
@Trancer, casi han pasado más de 1,5 años. Y ahora no uso Android. No puedo ayudarte ahora. Lo siento.
ssi-anik
entonces cual es la solucion
GA1
7
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                       finish();
                   break;
                }
                return true;
        }
Krunal Shah
fuente
2
Podrías haberlo agregado como comentario. Es más o menos lo mismo que la respuesta aceptada.
Sufian
7

Lo siento, la mía es una respuesta tardía, pero para cualquier otra persona que llegue a esta página con la misma pregunta, había intentado lo anterior:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
  ...
  if (item.getItemId() == android.R.id.home) {
    ....
  }
  ....
}

pero esto no pudo capturar el botón "Atrás".

Finalmente encontré un método que me funcionó en https://stackoverflow.com/a/37185334/3697478 que es anular el "onSupportNavigateUp ()" ya que estoy usando la barra de acciones de la biblioteca de soporte "AppCompatActivity". (Existe un equivalente "onNavigateUp ()" para la nueva biblioteca de barra de acciones / barra de herramientas).

@Override
public boolean onSupportNavigateUp(){  
  finish();  
  return true;  
}

y eliminé la sección "android: parentActivityName =". MainActivity "del archivo de manifiesto.

Stephen Bridgett
fuente
4

Lo he logrado, usando simplemente dos pasos,

Paso 1: Vaya a AndroidManifest.xml y agregue el parámetro en la etiqueta - android: parentActivityName = ". Home.HomeActivity"

ejemplo:

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

Paso 2: en ActivityDetail agregue su acción para la página / actividad anterior

ejemplo:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
       case android.R.id.home:
           onBackPressed();
           return true;
    }
    return super.onOptionsItemSelected(item);
 }
Vivek Hande
fuente
2

Si desea volver a la instancia anterior de una actividad presionando el botón de inicio de ActionBar, sin volver a crearla , puede anular el método getParentActivityIntent para usar el de la pila de actividades:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

EDITAR:
También puede lograr el mismo resultado
configurando el launchMode de su actividad principal en singleTop.
Así que configure android:launchMode="singleTop"la actividad de los padres en su manifiesto.
O puede usar la bandera FLAG_ACTIVITY_CLEAR_TOP con la intención UP.
referencia: Proporcionar navegación ascendente

Leo Droidcoder
fuente
2

(1) Agregue la actividad de los padres para la actividad de su hijo (AndroidManifest.xml)

<activity
        android:name=".ParentActivity" />

(2) anule el método onSupportNavigateUp dentro de la actividad secundaria

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}
Hariharan Kanakaraja
fuente
0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}
Roshaan Qurban
fuente
0

Hay varias formas de configurar el botón Atrás en la barra:

1) el método .setDisplayHomeAsUpEnabled(true);lo hará, y luego simplemente puede anularandroid.R.id.home

2) agregando <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />en Android Manifest, pero en este caso no puede anularandroid.R.id.home en OnOptionsMenuSelected.

.. para aquellos que se preguntan por qué no les funciona ...

Jiří
fuente