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 a la actividad BI, puedo usar el botón ARRIBA para volver a la actividad A. El problema es que la aplicación parece volver a llamar a la función onCreate () de la actividad A y este no es el comportamiento que necesito. Necesito que la actividad A tenga el mismo aspecto que tenía antes de llamar 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 desde la actividad A. Creo que se autogenera por eclipse.
La clase B se parece a:
@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);
}
Respuestas:
Declaraste la actividad A con el estándar
launchMode
en el manifiesto de Android. Según la documentación , eso significa lo siguiente:Por lo tanto, el sistema se ve obligado a recrear la actividad A (es decir, llamar
onCreate
) incluso si la pila de tareas se maneja correctamente.Para solucionar este problema, debe cambiar el manifiesto, agregando el siguiente atributo a la declaración de actividad A:
Nota: la llamada
finish()
(como se sugirió anteriormente como solución) solo funciona cuando está completamente seguro de que la instancia de actividad B que está terminando se encuentra 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 debe iniciar correctamente la actividad A desde B.fuente
navigateUpFromSameTask(...)
debe agregarseFLAG_ACTIVITY_CLEAR_TOP
aupIntent
(a través de lonavigateUpTo(...)
cual debe dar como resultado el mismo comportamiento (de acuerdo con esta guía ), pero el indicador nunca se establece, y por lo tanto esta respuesta tiene sentidoRespuesta actualizada: Diseño de navegación hacia arriba
Debe declarar qué actividad es la principal adecuada para cada actividad. Hacerlo permite que el sistema facilite patrones de navegación como Arriba porque el sistema puede determinar la actividad lógica principal del archivo de manifiesto.
Para eso, debe declarar su Actividad principal en la etiqueta Actividad con atributo
android:parentActivityName
Me gusta,
Con la actividad principal declarada de esta manera, puede navegar hasta el elemento primario apropiado como se muestra a continuación,
Entonces, cuando llama a
NavUtils.navigateUpFromSameTask(this);
este método, finaliza la actividad actual e inicia (o reanuda) la actividad principal adecuada. Si la actividad principal de destino está en la pila posterior de la tarea, se adelanta según lo definido porFLAG_ACTIVITY_CLEAR_TOP
.Y para mostrar el botón Arriba tienes que declarar
setDisplayHomeAsUpEnabled():
Respuesta anterior: (Sin navegación hacia arriba, navegación hacia atrás predeterminada)
Ocurre solo si está iniciando la Actividad A nuevamente desde la Actividad B.
Utilizando
startActivity()
.En lugar de esto desde la Actividad A, comience la Actividad B usando
startActivityForResult()
y anuleonActivtyResult()
en la Actividad A.Ahora en la Actividad B simplemente llame
finish()
al botón Arriba. Así que ahora te dirigiste a la Actividad AonActivityResult()
sin crear la Actividad A nuevamente.fuente
NavUtils.navigateUpFromSameTask(this);
escribir la línea de códigofinish()
.finish()
ostartActivityForResult()
en su documentación sobre Navegación ( developer.android.com/design/patterns/navigation.html )?Tenía casi la misma configuración que conducía al mismo comportamiento no deseado. Para mí, esto funcionó: agregar el siguiente atributo a una actividad A en el
Manifest.xml
de mi aplicación:Vea este artículo para más explicaciones.
fuente
Aunque es una vieja pregunta, aquí hay otra solución (en mi opinión, la más limpia y la mejor) ya que todas las respuestas anteriores no funcionaron para mí desde que conecté la Actividad B desde un widget .
[ https://stackoverflow.com/a/31350642/570168 ]
Pero también vea: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
fuente
Una mejor manera de lograr esto es usando dos cosas: llamar:
Ahora, para que esto funcione, debe hacer que su archivo de manifiesto indique que la actividad A tiene una actividad principal B. La actividad principal no necesita nada. En la versión 4 y superior, obtendrá una buena flecha hacia atrás sin esfuerzo adicional (esto se puede hacer en versiones inferiores también con un pequeño código, lo pondré a continuación) Puede configurar estos datos en el manifiesto-> pestaña de la aplicación en la GUI (desplácese hacia abajo 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 valor = your.full.activity.name
para obtener la buena flecha también en versiones inferiores:
tenga en cuenta que necesitará la versión 7 de la biblioteca de soporte para que todo funcione, ¡pero vale la pena!
fuente
Lo que funcionó para mí fue agregar:
ay
TheRelevantActivity.java
ahora está funcionando como se esperabay sí, no olvides agregar:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
enonCreate()
métodofuente
Lo intenté
android:launchMode="singleTask"
, pero no ayudó. Trabajó para mí usandoandroid:launchMode="singleInstance"
fuente
Agregando a la respuesta de @ LorenCK, cambie
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 otra aplicación
Esto iniciará una nueva tarea e iniciará la Actividad principal de su Actividad que puede definir en el Manifiesto como a continuación de la versión Min SDK <= 15
O usando
parentActivityName
si es> 15fuente
parentActivityName
para SDK> 15 o de lo contrario le dará algunos bloqueos aleatoriosTuve un problema similar al usar Android 5.0 con un mal nombre de actividad principal
Eliminé com.example.myfirstapp del nombre de la actividad principal y funcionó correctamente
fuente
Agregue a su actividad información de manifiesto con atributo
me esta funcionando bien
fuente
En clase Java: -
En manifiesto: -
Te ayudará
fuente
como una prensa de retroceso
fuente
prueba esto:
fuente
Entrando en mi manifiesto y agregando
android:launchMode="singleTop"
a la actividad me sirvió.Esto resolvió mi problema específicamente porque no quería que Android creara una nueva instancia de la actividad anterior después de presionar el botón
Up
presionar botón en la barra de herramientas; en cambio, quería usar la instancia existente de la actividad anterior cuando subía la jerarquía de navegación.Referencia: android: launchMode
fuente
Pruebe esta solución usando NavUtils.navigateUpFromSameTask (this); en la actividad infantil: https://stackoverflow.com/a/49980835/7308789
fuente