Mostrar el botón de retroceso en la barra de acción

181

Estoy tratando de mostrar un Back buttonen el Action barpara mover la página / actividad anterior o a la página principal (primera apertura). Y no puedo hacerlo.

mi código.

ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);

El código está adentro onCreate.

Dany Maor
fuente
19
Use: getSupportActionBar (). SetDisplayHomeAsUpEnabled (verdadero);
Sukitha Udugamasooriya
@SukithaUdugamasooriya Muchas gracias
Sardorbek Rkh

Respuestas:

207

bueno, esto es simple para mostrar el botón de retroceso

actionBar.setDisplayHomeAsUpEnabled(true);

y luego puede personalizar el evento posterior en onOptionsItemSelected

case android.R.id.home:
this.finish();
return true;
fhamicode
fuente
agregué las líneas anteriores dentro de onOptionsItemSelected (elemento MenuItem), dado que ya tengo un menú en la acción incorrecta, enumero los identificadores para redirigir las opciones de menú, la identificación de inicio no funciona cuando se hace clic
Si experimenta un comportamiento extraño (como en: usa el botón de retroceso (R.id.home) de un fragmento y termina cerrando la actividad), asegúrese de NO tener "android: noHistory" configurado en esta actividad, porque si usted lo hace, incluso volviendo de un fragmento a la "visión general" de la actividad lo terminará.
Igor
2
Asegúrese de establecer la actividad principal en AndroidMenifest.xml para que funcione el botón R.id.home.
Leap Hawk
192

Creo que onSupportNavigateUp()es la mejor y más fácil manera de hacerlo, consulte los pasos a continuación. El paso 1 es necesario, el paso dos tiene alternativa.

Paso 1 mostrando el botón de retroceso: agregue esta línea en el onCreate()método para mostrar el botón de retroceso.

assert getSupportActionBar() != null;   //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);   //show back button

Paso 2 implementación de clic posterior: anular este método

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

eso es todo lo que has hecho
O Paso 2 Alternativa: puedes agregar meta a la actividad en el archivo de manifiesto

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="MainActivity" />

Editar: si no está utilizando AppCompatActividad, entonces no use supportWord, puede usar

getActionBar().setDisplayHomeAsUpEnabled(true); // In `OnCreate();`

// And override this method
@Override 
public boolean onNavigateUp(){ 
     finish(); 
     return true; 
}

Gracias a @atariguy por tu comentario.

Inzimam Tariq IT
fuente
2
Esta solución funciona muy bien cuando necesita devolver datos a la actividad principal o si desea conservar los valores de EditText en la actividad principal. Intenté onOptionsItemSelectedsoluciones pero no lo hice.
weeix
3
La mejor solución +10.
Satheeshwaran
3
Si usted no está utilizando la biblioteca de soporte para la barra de acción, modificar de la siguiente manera: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy
1
Fenomenal. +1. Sencillo. Elegante. Hermoso. :)
Rohit Kumar
1
Gracias por tu ayuda. Al usar manifiesto, no funcionaba, pero usaba el código que sí funcionaba
Santosh devnath
70

La magia sucede en onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
Matthias Robbers
fuente
1
En mi caso, quiero agregar el botón Atrás en esa página donde el evento onOptionsItemSelected (elemento MenuItem) no estará allí ... ¿Hay alguna otra solución para eso?
Vidhi
1
Debe agregar getActionBar().setDisplayHomeAsUpEnabled(true);su onCreateMethod primero para mostrar el botón de retroceso
aletede91
1
Creo que si lo hace de esta manera, no retrocede, incluso si comienza la actividad anterior nuevamente, ahora tiene una instancia más y avanza siempre hacia adelante y hacia adelante hasta que se produce un desbordamiento de la pila si continúa lo suficiente. Creo que la respuesta de Igor es correcta, debe detener esta actividad con finish () y dejar que el marco lo lleve de vuelta a la instancia de actividad anterior en ejecución.
Reijo Korhonen
2
use el this.onBackPressed();método cuando el usuario haga clic en el botón Atrás.
CaptRisky
47

Solución oficial

Agregue esos dos fragmentos de código a su SubActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

agregue metadatos y parentActivity para manifestar para admitir un SDK inferior.

 <application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.SubActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Referencia aquí: http://developer.android.com/training/implementing-navigation/ancestral.html

ulular
fuente
55
Nota: si usa bibliotecas de soporte para compatibilidad con versiones anteriores, deberá usar "getSupportActionBar ()" en lugar de "getActionBar ()". Esta es la respuesta más completa y oficial.
Christopher Bull
32

Agregue estas líneas a onCreate ()

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
   actionBar.setHomeButtonEnabled(true);
   actionBar.setDisplayHomeAsUpEnabled(true);

y en onOptionItemSelected

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //Write your logic here
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Espero que esto te ayudará..!

Abhishek
fuente
27

Pruebe este código, lo considera solo si necesita el botón Atrás.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //YOUR CODE
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //YOUR CODE
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}
Jaime
fuente
17

En su onCreatemétodo agregue:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Al definir en la AndroidManifest.xmlactividad principal (la actividad que se llamará una vez que se presione el botón Atrás en la barra de acción):

En su <activity>definición en el Manifiesto, agregue la línea:

android:parentActivityName="com.example.activities.MyParentActivity"
Bruno Peres
fuente
Solo necesita poner el código de manifiesto si desea admitir dispositivos anteriores a 4.0. Sin embargo, el primer bit de código es una mejor solución para las bibliotecas actuales.
Louie Bertoncin
8

Sé que llego un poco tarde, pero pude solucionar este problema siguiendo los documentos directamente.

Agregue la etiqueta de metadatos a AndroidManifest.xml(para que el sistema lo sepa)

 <activity
        android:name=".Sub"
        android:label="Sub-Activity"
        android:parentActivityName=".MainChooser"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainChooser" />
    </activity>

A continuación, habilite el botón de retroceso (arriba) en su MainActivity

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_child);
 
    // my_child_toolbar is defined in the layout file 
    Toolbar myChildToolbar =
        (Toolbar) findViewById(R.id.my_child_toolbar);
    setSupportActionBar(myChildToolbar);
 
    // Get a support ActionBar corresponding to this toolbar 
    ActionBar ab = getSupportActionBar();
 
    // Enable the Up button 
    ab.setDisplayHomeAsUpEnabled(true);
    } 

¡Y estarás listo!

Fuente: Documentación del desarrollador de Android

Avi Parshan
fuente
6

Sé que lo anterior son muchas soluciones útiles, pero esta vez leí este artículo (Android Studio 2.1.2 actual con SDK 23), algunos de los métodos anteriores no funcionan.

A continuación se muestra mi solución para la sub-actividad es MapsActivity

Primero, debe agregar parentActivity en

AndroidManifest.xml

Me gusta esto :

<application ... >
    ...
    <!-- Main activity (which has no parent activity) -->
    <activity
        android:name="com.example.myapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        .....
        android:parentActivityName=".MainActivity" >
        <!-- Support Parent activity for Android 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
</application>

Segundo, asegúrese de que su sub-Actividad se extienda AppCompatActivity, no FragmentActivity.

Tercero, onOptionsItemSelected()método de anulación

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon action bar is clicked; go to parent activity
                this.finish();
                return true;
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Espero que esto ayude!

postace
fuente
4

Prueba esto, en tu onCreate ()

 getActionBar().setHomeButtonEnabled(true);
 getActionBar().setDisplayHomeAsUpEnabled(true);

Y para clickevent,

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
Melbourne Lopes
fuente
4

Para lograr esto, simplemente hay dos pasos,

Paso 1: vaya AndroidManifest.xmly agregue este parámetro en la <activity>etiqueta:android:parentActivityName=".home.HomeActivity"

Ejemplo:

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

Paso 2: ActivityDetailagregue su actionpara 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
4

en el método onCreate escribir

Toolbar toolbar = findViewById(R.id.tool);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
    finish();
}

y este es el archivo xml

<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:id="@+id/tool">

y en styles.xml cámbielo a

Theme.AppCompat.Light.NoActionBar

Esto es todo lo que tenemos que hacer.

PAWAN LAKHOTIA
fuente
4

Esto es simple y me funciona muy bien

agregue esto dentro del método onCreate ()

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

agregue esto fuera del método oncreate ()

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}
Muhaiminur Rahman
fuente
3

En su onCreate()método agregue esta línea

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

y, en la misma Actividad, agregue este método para manejar el clic del botón

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        this.finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}
Khubaib Raza
fuente
2

Resolví de esta manera

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

@Override
public void onBackPressed(){
    Intent backMainTest = new Intent(this,MainTest.class);
    startActivity(backMainTest);
    finish();
}
Ardit Zeza
fuente
1

mi código de trabajo para volver a la pantalla.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:

        Toast.makeText(getApplicationContext(), "Home Clicked",
                Toast.LENGTH_LONG).show();

        // go to previous activity
        onBackPressed();

        return true;

    }

    return super.onOptionsItemSelected(item);
}
Shihab Uddin
fuente
1
 public void initToolbar(){
       //this set back button 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       //this is set custom image to back button
       getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_btn_image);
}


//this method call when you press back button
@Override
public boolean onSupportNavigateUp(){
    finish();
    return true;
}
pruthwiraj.kadam
fuente
1
ActionBar actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

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

    return super.onOptionsItemSelected(item);
}
akshay shetty
fuente
1

Podría ser demasiado tarde para responder, pero tengo una solución más corta y más funcional en mi opinión.

// Inside your onCreate method, add these.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

// After the method's closing bracket, add the following method exactly as it is and voiulla, a fully functional back arrow appears at the action bar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}
ndungujan
fuente
1

En oncreate (); escribe esta línea->

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

luego implemente el siguiente método en esa clase

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        // app icon in action bar clicked; go home
      onBackPressed();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
Manthan Patel
fuente
1

Manifest.xml

<activity
            android:name=".Activity.SecondActivity"
            android:label="Second Activity"
            android:parentActivityName=".Activity.MainActivity"
            android:screenOrientation="portrait"></activity>
Sameer Srivastava
fuente
1

Para mostrar el botón de retroceso de la barra de acción en Kotlin, hay 2 formas de implementarlo

1. usando la barra de acción predeterminada proporcionada por Android : su actividad debe usar un tema que tenga barra de acción, por ejemplo: Theme.AppCompat.Light.DarkActionBar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val actionBar = supportActionBar
    actionBar!!.title = "your title"
    actionBar.setDisplayHomeAsUpEnabled(true)
    //actionBar.setDisplayHomeAsUpEnabled(true)
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

2. Diseñe su propia barra de acción : deshabilite la barra de acción predeterminada, por ejemplo: Theme.AppCompat.Light.NoActionBar: agregue diseño a su actividad.xml

    <androidx.appcompat.widget.Toolbar
     android:id="@+id/main_toolbar"
     android:layout_width="match_parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent">

     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:layout_editor_absoluteX="16dp">

         <TextView
             android:id="@+id/main_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Your Title"
             android:textSize="25sp"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

     </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.appcompat.widget.Toolbar>
  • onCreate
override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     setSupportActionBar(findViewById(R.id.main_toolbar))
 }
  • crea tu propio botó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/main_action_toolbar"
     android:icon="@drawable/ic_main_toolbar_item"
     android:title="find"
     android:layout_width="80dp"
     android:layout_height="35dp"
     app:actionLayout="@layout/toolbar_item"
     app:showAsAction="always"/>

</menu>
  • en YourActivity.kt
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main_toolbar_item, menu)

     leftToolbarItems = menu!!.findItem(R.id.main_action_toolbar)
     val actionView = leftToolbarItems.actionView
     val badgeTextView = actionView.findViewById<TextView>(R.id.main_action_toolbar_badge)
     badgeTextView.visibility = View.GONE

     actionView.setOnClickListener {
         println("click on tool bar")
     }
     return super.onCreateOptionsMenu(menu)
 }
Chea Sambath
fuente
0

Agregue el siguiente código en la función onCreate:

getSupportActionBar (). setDisplayHomeAsUpEnabled (verdadero);

Y luego anular: @Override public boolean onOptionsItemSelected (elemento MenuItem) {onBackPressed (); volver verdadero; }

usuario7347514
fuente
0

En la versión actualizada getActionBar () no funciona!

En cambio, puedes hacer esto de esta manera

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

agregar el botón de retroceso en la barra de título de Android esto te ayuda en 2020

pankaj maurya
fuente
Sus dos últimas respuestas enlazan al mismo sitio. ¿Estás asociado / afiliado a ese sitio de alguna manera? Si está afiliado, debe divulgar esa afiliación en la publicación . Si no divulga la afiliación, se considera spam. Ver: ¿Qué significa "buena" autopromoción? , algunos consejos y sugerencias sobre autopromoción , ¿Cuál es la definición exacta de "spam" para Stack Overflow? y Qué hace que algo sea spam .
Makyen