Кнопка "Назад" и обновление предыдущей активности

Если у нас есть два действия:

  • Список файлов и последнее изменение времени
  • Действия по редактированию файлов

Пользователь выбирает файл из списка и переходит к активности редактирования файла. По завершении редактирования пользователь нажимает кнопку "Назад", чтобы вернуться к списку файлов.

Список не перезагружается, и поэтому отображается измененное время только что отредактированных файлов.

Каков надлежащий метод обновления списка файлов после нажатия кнопки "Назад"?

В этом примере предполагается, что база данных не используется, просто ArrayAdapter.

Ответ 1

Один из вариантов заключается в использовании onResume вашего первого действия.

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

Или вы можете запустить Activity for Result:

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

В SecondActivity, если вы хотите отправить обратно данные:

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

если вы не хотите возвращать данные:

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

Теперь в вашем классе FirstActivity напишите следующий код для метода onActivityResult()

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

Ответ 2

Я думаю, что onRestart() работает лучше для этого.

@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
}

Вы можете указать, что вы хотите сделать, когда действие перезапущено (снова вызвано нажатием кнопки "назад" ) внутри onRestart().

Например, если вы хотите сделать то же самое, что и в onCreate(), вставьте код в onRestart() (например, восстановите пользовательский интерфейс с обновленными значениями).

Ответ 3

в основном:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}

Ответ 4

Я бы рекомендовал переопределить метод onResume() в действии номер 1, а там включить код для обновления вашего адаптера массива, это делается с помощью [yourListViewAdapater].notifyDataSetChanged();

Прочтите это, если у вас возникли проблемы с обновлением списка: Обновление просмотра списка Android

Ответ 5

Если вы хотите обновить предыдущую активность, это решение должно работать:

В предыдущем действии, в котором вы хотите обновить:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}

Ответ 6

Если не обрабатывать обратный вызов из действия редактирования (с помощью onActivityResult), я бы предпочел поставить логику, о которой вы говорили в onStart (или, возможно, в onRestart), поскольку наличие ее в onResume просто кажется излишним, учитывая, что изменения только после onStop.

Во всяком случае, ознакомьтесь с жизненным циклом активности. Кроме того, обратите внимание на методы onRestoreInstanceState и onSaveInstanceState, которые не отображаются на диаграмме довольно жизненного цикла.

(Кроме того, стоит рассмотреть, как Учебник по блокноту обрабатывает то, что вы делаете, хотя он использует базу данных.)

Ответ 7

Лучше всего думать, что он использует

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

Ответ 8

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();
    }
}

У меня только категория избранных, поэтому, когда я нажимаю на элемент из избранных, появляется такая информация, и если я в отличие от нее - этот элемент следует удалить из Избранного: для этого я обновляю базу данных и устанавливаю ее в адаптер (для recyclerview) [ Я хочу, чтобы вы поняли мою проблему и решение]

Ответ 9

Попробуйте это

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

}

или во фрагменте

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

}

И добавьте этот метод в свой onBackPressed(), например,

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

Вот так...

Ответ 10

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}