java - regresar - programar boton atras android studio
¿Cómo implementar el botón Atrás de Android ActionBar? (8)
Anotaciones de Android:
@OptionsItem(android.R.id.home)
void homeSelected() {
onBackPressed();
}
Tengo una actividad con una lista. 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 acciones la flecha hacia atrás junto al ícono de la aplicación no se activa. ¿Me estoy perdiendo de algo?
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 :]
Asegúrate de que tu botón de inicio de ActionBar esté habilitado 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 forma, todas las actividades que desee pueden 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);
}
}
Creo que onSupportNavigateUp()
es la forma más simple y mejor de hacerlo
verifique el código en este enlace Haga clic aquí para ver el código completo
Los siguientes pasos son suficientes para retroceder el botón:
Paso 1: este código debe estar en Manifest.xml
<activity android:name=".activity.ChildActivity"
android:parentActivityName=".activity.ParentActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.ParentActivity" /></activity>
Paso 2: no darás
finish();
en su actividad principal mientras comienza la actividad infantil.
Paso 3: Si necesita regresar a la Actividad principal de la Actividad infantil, entonces simplemente dé este código para la Actividad infantil.
startActivity(new Intent(ParentActivity.this, ChildActivity.class));
Para habilitar el botón Atrás de ActionBar, obviamente necesita una Barra de acción en su Actividad. Esto está establecido por el tema que estás usando. Puede configurar el tema para su actividad en AndroidManfiest.xml
. Si está utilizando, por ejemplo, el tema @android:style/Theme.NoTitleBar
, no tiene una barra de acciones. En este caso, la llamada a getActionBar()
devolverá nulo. Así que asegúrese de tener primero una barra de acciones.
El siguiente paso es configurar el android:parentActivityName
a la actividad que desea navegar si presiona el botón Atrás. Esto también debe hacerse en AndroidManfiest.xml
.
Ahora puede habilitar el botón Atrás en el método onCreate
de su actividad "hijo".
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
Ahora deberías implementar la lógica para el botón Atrás. Simplemente anula el método onOptionsItemSelected
en su actividad "secundaria" y comprueba la id del botón Atrás que es android.R.id.home
.
Ahora puede activar el método NavUtils.navigateUpFromSameTask(this);
PERO si no ha especificado el android:parentActivityName
en su AndroidManfiest.xml
esto bloqueará su aplicación.
A veces esto es lo que desea porque le recuerda que olvidó "algo", pero si desea evitarlo, puede verificar si su actividad tiene un padre que usa el método getParentActivityIntent()
. Si esto devuelve null, no ha especificado el padre.
En este caso, puede disparar el método onBackPressed()
que básicamente hace lo mismo que si el usuario presiona el botón Atrás en el dispositivo. Una buena implementación que nunca interrumpe tu 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 de usted por qué camino tomar, pero encontré la solución útil, especialmente si utiliza una clase base para todas sus actividades.
Selvin ya publicó la respuesta correcta, aquí solo está la solución en código bonito ;-)
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 padre 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
https://.com/a/46903870/4489222
Para lograr esto, hay simplemente dos pasos,
Paso 1: vaya a AndroidManifest.xml y agregue el parámetro en tag - 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);}
}