android - programacion - ¿Cómo puedo regresar a una actividad principal correctamente?
manual de android en pdf (16)
Tengo 2 actividades (A y B) en mi aplicación de Android y uso la intención de pasar de la actividad A a la actividad B. El uso de parent_activity está habilitado:
<activity
android:name=".B"
android:label="B" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
También uso un tema que proporciona un botón ARRIBA.
Entonces, después de llamar actividad, BI puede usar el botón ARRIBA para volver a la actividad A. El problema es que la aplicación parece llamar de nuevo a la función onCreate () de la actividad A y este no es el comportamiento que necesito. Necesito que la actividad A se vea igual que antes, llamé a la actividad B.
¿Hay una manera de lograr esto?
Gracias por adelantado
EDITAR:
No escribí ningún código para iniciar la actividad B de la actividad A. Creo que se autogenera por eclipse.
La clase B se ve así:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Añadiendo a la respuesta de @ LorenCK, cambiar
NavUtils.navigateUpFromSameTask(this);
al código a continuación si su actividad puede iniciarse desde otra actividad y esto puede convertirse en parte de la tarea iniciada por alguna otra aplicación
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
Esto iniciará una nueva tarea e iniciará la Actividad principal de su Actividad que puede definir en Manifiesto como se muestra a continuación de la versión Min SDK <= 15
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
O usando parentActivityName
si es> 15
Agregue a su actividad información de manifiesto con atributo
android:launchMode="singleTask"
me está funcionando bien
Aunque es una vieja pregunta, aquí hay otra solución (la más limpia y la mejor) ya que todas las respuestas anteriores no me funcionaron, ya que enlacé profundamente la Actividad B desde un Widget .
public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
Log.v(logTag, "Recreate back stack");
TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
}
[ https://.com/a/31350642/570168 ]
Pero también vea: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
En la clase de Java: -
toolbar = (Toolbar) findViewById(R.id.apptool_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Snapdeal");
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
En Manifiesto: -
<activity
android:name=".SubActivity"
android:label="@string/title_activity_sub"
android:theme="@style/AppTheme" >
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data>
</activity>
Esto te ayudará
Entrar en mi manifiesto y agregar android:launchMode="singleTop"
a la actividad me sirvió de algo.
Esto solucionó específicamente mi problema porque no quería que Android creara una nueva instancia de la actividad anterior después de presionar el botón Up
en la barra de herramientas; en cambio, quería usar la instancia existente de la actividad anterior cuando subía por la jerarquía de navegación.
Referencia: android: launchMode
Has declarado la actividad A con el launchMode
estándar en el manifiesto de Android. De acuerdo con la documentación , eso significa lo siguiente:
El sistema siempre crea una nueva instancia de la actividad en la tarea objetivo y enruta el intento hacia ella.
Por lo tanto, el sistema se ve obligado a recrear la actividad A (es decir, llamar a onCreate
) incluso si la pila de tareas se maneja correctamente.
Para solucionar este problema, debe cambiar el manifiesto y agregar el siguiente atributo a la declaración de actividad A:
android:launchMode="singleTop"
Nota: llamar a finish()
(como se sugirió anteriormente) solo funciona cuando está completamente seguro de que la instancia de actividad B que está terminando vive encima de una instancia de actividad A. En flujos de trabajo más complejos (por ejemplo, iniciar la actividad B desde una notificación) este podría no ser el caso y tiene que iniciar correctamente la actividad A desde B.
Intenté android:launchMode="singleTask"
, pero no ayudó. Trabajé para mí usando android:launchMode="singleInstance"
Lo que funcionó para mí fue agregar:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
finish();
}
a TheRelevantActivity.java
y ahora está funcionando como se esperaba
y sí, no olvides agregar:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
en el método onCreate()
Pruebe esta solución usando NavUtils.navigateUpFromSameTask (this); en la actividad infantil: https://.com/a/49980835/7308789
Tenía casi la misma configuración que conduce al mismo comportamiento no deseado. Para mí, funcionó agregar el siguiente atributo a la actividad A en Manifest.xml de mi aplicación:
android: launchMode = "singleTask"
Consulte http://www.peachpit.com/articles/article.aspx?p=1874864 para obtener una explicación.
Tuve un problema similar al usar Android 5.0 con un nombre de actividad padre malo
<activity
android:name=".DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
Eliminé el archivo com.example.myfirstapp del nombre de la actividad principal y funcionó correctamente
Una mejor manera de lograr esto es usar dos cosas: llamar:
NavUtils.navigateUpFromSameTask(this);
Ahora, para que esto funcione, necesita que su archivo de manifiesto indique que la actividad A tiene una actividad primaria B. La actividad principal no necesita nada. En la versión 4 y superior obtendrás una buena flecha hacia atrás sin esfuerzo adicional (esto también se puede hacer en versiones más bajas con un pequeño código, lo pondré debajo). Puedes establecer estos datos en la pestaña manifestación-> aplicación en la GUI (desplácese hasta el nombre de la actividad principal y póngalo a mano)
Nodo de soporte:
si desea admitir la versión inferior a la versión 4, también debe incluir metadatos. Haga clic derecho en la actividad, agregue-> metadatos, nombre = android.support.PARENT_ACTIVITY y value = your.full.activity.name
para obtener la buena flecha en versiones inferiores también:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
tenga en cuenta que necesitará la versión 7 de la biblioteca de soporte para que todo funcione, ¡pero vale la pena!
Utilice finish()
en la actividad para regresar cuando esté en su evento de clic.
prueba esto:
Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
intent = getIntent();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpTo(this,intent);
return true;
}
return super.onOptionsItemSelected(item);
}
Respuesta actualizada: Diseño de navegación ascendente
Debe declarar qué actividad es el padre apropiado para cada actividad. Al hacerlo, el sistema puede facilitar los patrones de navegación, como Up porque el sistema puede determinar la actividad principal lógica del archivo de manifiesto.
Entonces para eso tienes que declarar tu actividad padre en la actividad de etiqueta con atributo
android:parentActivityName
Me gusta,
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.app_name.A" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name=".B"
android:label="B"
android:parentActivityName="com.example.app_name.A" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
Con la actividad principal declarada de esta manera, puede navegar hasta el padre apropiado como se muestra a continuación,
@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);
}
Entonces cuando llamas a NavUtils.navigateUpFromSameTask(this);
este método, finaliza la actividad actual y comienza (o reanuda) la actividad principal apropiada. Si la actividad padre objetivo está en la pila posterior de la tarea, se adelanta como lo define FLAG_ACTIVITY_CLEAR_TOP
.
Y para mostrar el botón Arriba, debe declarar setDisplayHomeAsUpEnabled():
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
Respuesta anterior: (Sin navegación hacia arriba, Navegación hacia atrás predeterminada)
Sucede solo si está comenzando la Actividad A nuevamente desde la Actividad B.
Usando startActivity()
.
En lugar de esto, desde la Actividad A, comienza la Actividad B usando startActivityForResult()
y anula onActivtyResult()
en la Actividad A.
Ahora en la Actividad B simplemente llame a finish()
en el botón Arriba. Así que ahora usted dirigió a Activity A''s onActivityResult()
sin crear de la Actividad A nuevamente ..
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar''s Up/Home button
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
como una retroceso