Botón de retroceso y actualización de la actividad anterior

84

Si tenemos dos actividades:

  1. Lista de archivos y hora de última modificación
  2. Actividad de edición de archivos

Un usuario selecciona un archivo de la lista y es llevado a la actividad de edición de archivos. Cuando termine de editar, el usuario presiona el botón Atrás para regresar a la lista de archivos.

La lista no se vuelve a cargar y, por lo tanto, se muestra un valor incorrecto para el tiempo de modificación de los archivos recién editados.

¿Cuál es el método adecuado para hacer que la lista de archivos se actualice después de presionar el botón Atrás?

Este ejemplo asume que no se está utilizando ninguna base de datos, solo un ArrayAdapter.

Paul
fuente
1
onRestart () debería funcionar mejor. onResume () se llamará dos veces, y onRestart () se llamará solo cuando presione el botón Atrás.
Sarah Sakamoto

Respuestas:

108

Una opción sería utilizar el onResume de su primera actividad.

@Override
public void onResume()
    {  // After a pause OR at startup
    super.onResume();
    //Refresh your stuff here
     }

O puede iniciar Actividad para Resultado:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

En secondActivity si desea devolver datos:

 Intent returnIntent = new Intent();
 returnIntent.putExtra("result",result);
 setResult(RESULT_OK,returnIntent);     
 finish();

si no desea devolver datos:

Intent returnIntent = new Intent();
setResult(RESULT_CANCELED, returnIntent);        
finish();

Ahora en su clase FirstActivity escriba el siguiente código para el onActivityResult()método

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (requestCode == 1) {

     if(resultCode == RESULT_OK){      
         //Update List         
     }
     if (resultCode == RESULT_CANCELED) {    
         //Do nothing?
     }
  }
}//onActivityResult
Waza_Be
fuente
¿Qué
pasa
@Waza_Be onResumeno me llamaron, ¿alguna idea de por qué? ( Lo intenté onRestarty onPausetambién, pero ninguno de ellos no llamó )
Mehdi Dehghani
En mi caso, he pasado a la Actividad de Fragmento. Entonces, al regresar de Activity a fragment, ya que otras respuestas mencionan onRestart () que no está contenido en Fragment, entonces, esta respuesta funcionó para mí. Para un fragmento, puede usar onResume ().
Feroz Khan
39

Creo que onRestart () funciona mejor para esto.

@Override
public void onRestart() { 
    super.onRestart();
    //When BACK BUTTON is pressed, the activity on the stack is restarted
    //Do what you want on the refresh procedure here
}

Puede codificar lo que desea hacer cuando se reinicia la actividad (se llama nuevamente desde el evento 'botón de retroceso presionado') dentro de onRestart ().

Por ejemplo, si desea hacer lo mismo que hace en onCreate (), pegue el código en onRestart () (por ejemplo, reconstruyendo la interfaz de usuario con los valores actualizados).

Sarah Sakamoto
fuente
7
Esto es trivial, pero tengo que decirlo: obviamente, sería mejor mover su código onCreate () a un método separado que luego invoque tanto desde onCreate () como desde onRestart () en lugar de copiar y pegarlo.
Ricardo van den Broek
También puede usar onCreate () solo para inflar vistas e instanciar variables globales y usar onStart () para asignar / (re) establecerlas. Por lo tanto, su init () (o como quiera llamarlo) será llamado siempre que comience la actividad; es decir, después de onCreate () o después de onRestart ().
jwehrle
Esto es realmente útil si necesita que se reinicialice el ViewModel de sus actividades. Permite recuperar de la base de datos nuevamente, configurar variables de instancia ...
enorme
34

en principal:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}
Hamze shoae
fuente
Supongo que esto se aplica a la actividad actual y no a la actividad anterior.
Si8
1
Tuve el mismo problema, excepto que el mío era un Fragmento, no una Actividad. Por lo tanto, sigo los consejos aquí y funcionó: stackoverflow.com/questions/35039512/…
David C.
8

Recomendaría anular el onResume()método en la actividad número 1, y allí incluir código para actualizar su adaptador de matriz, esto se hace usando[yourListViewAdapater].notifyDataSetChanged();

Lea esto si tiene problemas para actualizar la lista: Actualización de la vista de lista de Android

ciego
fuente
2

Si desea actualizar la actividad anterior, esta solución debería funcionar:

En la actividad anterior donde desea actualizar:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}
Tô Minh Tiến
fuente
1
private Cursor getAllFavorites() {
    return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name,
            null,
            null,
            null,
            null,
            null,
            DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest);
}
@Override
public void onResume()
{  // After a pause OR at startup
    super.onResume();
    mAdapter.swapCursor(getAllFavorites());
    mAdapter.notifyDataSetChanged();

}

public void swapCursor(Cursor newCursor){
    if (mCursor!=null) mCursor.close();
    mCursor = newCursor;
    if (newCursor != null){
        mAdapter.notifyDataSetChanged();
    }
}

Solo tengo la categoría de favoritos, así que cuando hago clic en el elemento de favoritos, aparece dicha información y, si no me gusta, este elemento debe eliminarse de Favoritos: para eso, actualizo la base de datos y la configuro en el adaptador (para la vista de reciclaje) [Te deseo entenderá mi problema y mi solución]

Aizhan Nessipbayeva
fuente
considere agregar alguna explicación
Gahan
1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

En la actividad anterior use este código. Esto hará una transición suave y recargará la actividad cuando regrese presionando el botón Atrás.

Robiul Hossain Shah Imran
fuente
¿Puede agregar alguna descripción al código y gracias por la publicación?
Nelles
0

Si no está manejando una devolución de llamada de la actividad de edición (con onActivityResult), entonces prefiero poner la lógica que mencionó en onStart (o posiblemente en onRestart), ya que tenerla en onResume parece una exageración, dado que los cambios solo ocurren después onStop.

En cualquier caso, familiarícese con el ciclo de vida de la actividad . Además, tome nota de los métodos onRestoreInstanceState y onSaveInstanceState, que no aparecen en el bonito diagrama de ciclo de vida.

(Además, vale la pena revisar cómo el Tutorial del Bloc de notas maneja lo que está haciendo, aunque usa una base de datos).

Himno de Thane
fuente
0

La mejor manera de hacerlo es usando

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);
Flavio Candido
fuente
0

Prueba esto

 public void refreshActivity() {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

o en fragmento

  public void refreshActivity() {
    Intent i = new Intent(getActivity(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

Y agregue este método a su onBackPressed () como

  @Override
public void onBackPressed() {      
        refreshActivity();
        super.onBackPressed();
    }
}

Eso es...

Rahul
fuente
0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}
Syed Zaidi
fuente
Esta pregunta tiene algunos años y la respuesta proporcionada se marcó para su revisión como una publicación de baja calidad. Aquí hay algunas pautas para ¿Cómo escribo una buena respuesta? . Hay otras respuestas que proporcionan la pregunta del OP y se publicaron hace algún tiempo. Cuando publique una respuesta, asegúrese de agregar una nueva solución o una explicación sustancialmente mejor, especialmente al responder preguntas más antiguas.
help-info.de