¿Cómo puedo volver a una actividad de padres correctamente?
Tengo 2 actividades (A y B) en mi aplicación android y uso una 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 utilizo un tema que proporciona un botón UP.
- Android: Regresar a la actividad anterior
- Android EXTRA_MESSAGE no reconocido dentro de Recycler View Adapter
- Extraer / distinguir el nombre de ActivityAlias de TargetActivity
- Conexión profunda de Android a una aplicación
- Intención equivocada de conseguir
Así que después de llamar a la actividad BI puede usar el botón UP para volver a la actividad A. El problema es que la aplicación parece llamar a la función onCreate () de la actividad A de nuevo y este no es el comportamiento que necesito. Necesito que la actividad A se vea de la misma manera que 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 de la actividad A. Creo que es autogenerado 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); }
- No se puede hacer startActivity () con Chooser preguntando una vez por aplicación
- La cámara no funciona / ahorra al usar Uri de caché como MediaStore.EXTRA_OUTPUT
- Tutorial / referencia para iniciar ACTION_EDIT con imagen y devolver imagen
- Implícita vs intención explícita en Android (startActivity (intención) se bloquea)
- ¿Cómo programar una llamada?
- Llamar a una actividad dentro de un módulo de biblioteca de android
- Amplíe el tiempo de grabación de vídeo en Google Glass
- ¿Por qué mi aplicación no está en la lista de aplicaciones para abrir el archivo txt?
Declaró la actividad A con el launchMode
estándar en el manifiesto de Android. Según la documentación , significa lo siguiente:
El sistema siempre crea una nueva instancia de la actividad en la tarea de destino y enruta la intención hacia ella.
Por lo tanto, el sistema se ve obligado a recrear la actividad A (es decir, llamando a onCreate
) incluso si la pila de tareas se gestiona correctamente.
Para solucionar este problema, debe cambiar el manifiesto, agregando el siguiente atributo a la declaración de actividad A:
android:launchMode="singleTop"
Nota: llamar a finish()
(como se sugirió como solución antes) sólo 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, Una notificación), tal vez no sea el caso y debe iniciar correctamente la actividad A desde B.
Respuesta actualizada: Diseño de navegación hacia arriba
Tienes que declarar qué actividad es el padre apropiado para cada actividad. Si lo hace, el sistema puede facilitar los patrones de navegación como Up porque el sistema puede determinar la actividad lógica de los padres desde el archivo de manifiesto.
Así que para eso tienes que declarar tu padre Actividad en la etiqueta Actividad 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 padre declarada de esta manera, puede navegar hasta el padre apropiado como 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); }
Por lo tanto, cuando se llama NavUtils.navigateUpFromSameTask(this);
Este método, finaliza la actividad actual y comienza (o reanuda) la actividad de los padres apropiada. Si la actividad principal de destino está en la pila trasera de la tarea, se avanza según se define en FLAG_ACTIVITY_CLEAR_TOP
.
Y para mostrar el botón setDisplayHomeAsUpEnabled():
tienes que declarar setDisplayHomeAsUpEnabled():
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }
Respuesta Antigua: (Sin Navegación, Navegación por Defecto predeterminada)
Sucede solamente si usted está comenzando la actividad A otra vez de la actividad B.
Utilizar startActivity()
.
En lugar de esto desde la Actividad A comienza la Actividad B usando startActivityForResult()
y sobreescribe onActivtyResult()
en la Actividad A.
Ahora en la Actividad B acaba de llamar al finish()
en el botón Arriba. Así que ahora onActivityResult()
a Actividad A onActivityResult()
sin crear de Actividad A de nuevo ..
Tuve casi la misma configuración que conduce al mismo comportamiento no deseado. Para mí trabajó para agregar el siguiente atributo a la actividad A en el Manifest.xml de mi aplicación:
Android: launchMode = "singleTask"
Consulte http://www.peachpit.com/articles/article.aspx?p=1874864 para obtener explicaciones.
A pesar de una vieja pregunta, aquí está otra (imho la solución más limpia y mejor) como todas las respuestas anteriores no funcionó para mí, ya que deeplinked la actividad B de 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://stackoverflow.com/a/31350642/570168 ]
Pero también vea: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
Una mejor manera de lograr esto es usando dos cosas: llamada:
NavUtils.navigateUpFromSameTask(this);
Ahora, para que esto funcione, necesitas que el archivo de manifiesto indique que la actividad A tiene una actividad padre B. La actividad padre no necesita nada. En la versión 4 o superior obtendrás una buena flecha hacia atrás sin ningún esfuerzo adicional (esto se puede hacer en las versiones inferiores, así con un pequeño código, lo pondré debajo) Puedes configurar estos datos en la ficha manifesto-> aplicación En la GUI (desplácese hasta el nombre de actividad principal y póngalo a mano)
Nodo de soporte:
Si desea dar soporte a la versión anterior a la versión 4, también debe incluir metadatos. Haga clic con el botón derecho en la actividad, añada-> metadatos, nombre = android.support.PARENT_ACTIVITY y valor = your.full.activity.name
Para obtener la flecha agradable 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!
Tuve un problema similar al usar android 5.0 con un nombre de actividad padre mal
<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>
Quité el com.example.myfirstapp del nombre de actividad principal y funcionó correctamente
Intenté android:launchMode="singleTask"
, pero no ayudó. Trabajó para mí usando android:launchMode="singleInstance"
Añadiendo a la respuesta de @ LorenCK, cambie
NavUtils.navigateUpFromSameTask(this);
Al código siguiente si su actividad se puede iniciar 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 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 usar parentActivityName
si su> 15
Agregue a su información de manifiesto de actividad con el atributo
android:launchMode="singleTask"
Esta funcionando bien para mi
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 te olvides de añadir:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
En el método onCreate()
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); }
@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 prensa trasera
Utilice finish()
en actividad para volver cuando en su evento de clic.
Entrar en mi manifiesto y añadir android:launchMode="singleTop"
a la actividad hizo el truco para mí.
Esto solucionó específicamente mi problema porque no quería que Android creara una nueva instancia de la actividad anterior después de pulsar el botón Up
de la barra de herramientas. En cambio, quería usar la instancia existente de la actividad anterior cuando subí la jerarquía de navegación.
Referencia: android: launchMode
En clase 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á
- Escala de imagen para rellenar el ancho de ImageView y mantener la relación de aspecto
- Cómo utilizar ArrayAdapter <myClass>