¿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?
- Compruebe si String en String está en ArrayList <string>
- ¿Cómo hacer que el botón de cancelar trabaje en llamada sdk vinculada en la vista web android?
- Android: enum vs static final ints?
- ¿Cómo desinstalar completamente el SDK de tejido de Twitter del proyecto android?
- ¿Cómo leer un archivo en un mapa de bits de Java?
- Obtener el error "no se puede resolver el método" al intentar implementar getSharedPreferences en Android Studio
- GetActionBar () no está definido
- ¿Hay alguna manera de comprobar si una variable está definida en Java?
- SetAlpha para ver programaticamente
- La aplicación se bloquea cuando se ejecuta utilizando Google Maps api v2
- Obtener un inflador de diseño desde el ApplicationContext
- GetExternalStorageDirectory no funciona
- Cómo consultar el SpeechRecognizer predeterminado
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(); }
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
- Obtener las coordenadas de View en relación con el diseño raíz
- Proguard infierno – no puede encontrar la clase referenciada