¿Cómo implementar el botón de retroceso de Android ActionBar?

Tengo una actividad con un listview. Cuando el usuario hace clic en el elemento, se abre el elemento "visor":

List1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { Intent nextScreen = new Intent(context,ServicesViewActivity.class); String[] Service = (String[])List1.getItemAtPosition(arg2); //Sending data to another Activity nextScreen.putExtra("data", datainfo); startActivityForResult(nextScreen,0); overridePendingTransition(R.anim.right_enter, R.anim.left_exit); } }); 

Esto funciona bien, pero en la barra de acción la flecha de retroceso al lado del icono de la aplicación no se activa. ¿Me estoy perdiendo de algo?

Selvin ya publicó la respuesta correcta, aquí es sólo la solución en código bastante 😉

 public class ServicesViewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // etc... getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; default: return super.onOptionsItemSelected(item); } } } 

La función NavUtils.navigateUpFromSameTask(this) requiere que defina la actividad principal en el archivo AndroidManifest.xml

  <activity android:name="com.example.ServicesViewActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.ParentActivity" /> </activity> 

http://developer.android.com/design/patterns/navigation.html#up-vs-back

Asegúrese de que el botón Inicio de ActionBar está activado en la Actividad:

Android, API 5+:

 @Override public void onBackPressed() { ... super.onBackPressed(); } 

ActionBarSherlock y App-Compat, API 7+:

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

Android, API 11+:

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

Ejemplo MainActivity que extiende ActionBarActivity :

 public class MainActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Back button getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // API 5+ solution onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } } 

De esta manera todas las actividades que desea puede tener la contrapresión.

Android, API 16+:

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

AndroidManifest.xml :

 <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.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- The meta-data element is needed for versions lower than 4.1 --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application> 

Ejemplo MainActivity que extiende ActionBarActivity :

 public class MainActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Back button getSupportActionBar().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); } } 

Para activar el botón Atrás de ActionBar obviamente necesita una ActionBar en su Actividad. Esto se establece por el tema que está utilizando. Puede configurar el tema de su actividad en AndroidManfiest.xml . Si utiliza por ejemplo el tema @android:style/Theme.NoTitleBar , no tiene una ActionBar. En este caso, la llamada a getActionBar() devolverá null. Así que asegúrese de tener una ActionBar primero.

El siguiente paso es establecer el android:parentActivityName en la actividad que desea navegar si pulsa el botón Atrás. Esto también se debe hacer en AndroidManfiest.xml .

Ahora puede activar el botón de retroceso en el método onCreate de su actividad "secundaria".

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

Ahora debe implementar la lógica del botón de retroceso. Simplemente anule el método onOptionsItemSelected en su actividad "secundaria" y compruebe el id del botón de retroceso que es android.R.id.home .

Ahora puede activar el método NavUtils.navigateUpFromSameTask(this); PERO si no ha especificado el android:parentActivityName en AndroidManfiest.xml esto bloqueará su aplicación.

A veces esto es lo que quieres porque te recuerda que olvidaste "algo" pero si quieres evitarlo, puedes comprobar si tu actividad tiene un padre usando el método getParentActivityIntent() . Si esto devuelve null, no ha especificado el padre.

En este caso, puede disparar el método onBackPressed() que hace básicamente lo mismo que si el usuario presionara el botón de retroceso en el dispositivo. Una buena implementación que nunca se bloquea aplicación sería

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (getParentActivityIntent() == null) { Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!"); onBackPressed(); } else { NavUtils.navigateUpFromSameTask(this); } return true; default: return super.onOptionsItemSelected(item); } } 

Tenga en cuenta que la animación que ve el usuario es diferente entre NavUtils.navigateUpFromSameTask(this); Y onBackPressed() .

Depende del camino que tomes, pero encontré la solución útil, especialmente si utilizas una clase base para todas tus actividades.

Anotaciones para Android:

 @OptionsItem(android.R.id.home) void homeSelected() { onBackPressed(); } 

Fuente: https://github.com/excilys/androidannotations

Archivo AndroidManifest:

  <activity android:name=".activity.DetailsActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="br.com.halyson.materialdesign.activity.HomeActivity" /> </activity> 

Agregar en DetailsActivity:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } 

es trabajo :]

Creo que onSupportNavigateUp() es la manera más simple y mejor de hacerlo

Compruebe el código en este enlace Haga clic aquí para el código completo

  • ¿La manera más rápida de leer largo del archivo?
  • Cómo iniciar la pantalla de inicio mediante programación en Android
  • Pruebas en modo "Avión" en Android Emulator
  • Error: com.jayway.maven.plugins.android.generation2: android-maven-plugin: 3.6.0: generate-sources
  • Cómo obtener un mensaje de devolución de servicio de Android desde un plugin de teléfono
  • NullPointerException en la reflexión durante el arranque de Robolectric - cualquier sugerencias?
  • Cómo leer / interceptar mensaje USSD que viene en el teléfono Android
  • Programáticamente eliminar SMS no funciona
  • ¿Debo usar "_activity = this;"?
  • OkHttp javax.net.ssl.SSLPeerUnverifiedException: Nombre de host domain.com no verificado
  • Android Studio no puede resolver ninguna dependencia
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.