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

85

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

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

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

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

Каков правильный метод обновления списка файлов после нажатия кнопки «Назад»?

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

Павел
источник
1
onRestart () должен работать лучше. onResume () будет вызываться дважды, а onRestart () будет вызываться только при нажатии кнопки возврата.
Сара Сакамото

Ответы:

108

Один из вариантов - использовать 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
Waza_Be
источник
что, если я не хочу заканчивать текущее действие и хочу обновить предыдущее действие
Mansuu ....
@Waza_Be onResumeне звоните мне, знаете, почему? ( Я пробовал onRestartи onPauseтоже, но никто из них не звонил )
Мехди Дехгани
В моем случае я перешел в Activity из фрагмента. Итак, возвращаясь из Activity к фрагменту, поскольку в других ответах упоминается onRestart (), который не содержится во фрагменте, Итак, этот ответ сработал для меня. Для фрагмента вы можете использовать onResume ().
Фероз Хан
40

Я думаю, что 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
}

Вы можете закодировать то, что хотите сделать, когда Activity перезапускается (вызывается снова из события «нажата кнопка возврата») внутри onRestart ().

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

Сара Сакамото
источник
7
Это тривиально, но я должен сказать это: очевидно, было бы лучше переместить ваш код onCreate () в отдельный метод, который вы затем вызываете как из onCreate (), так и из onRestart (), вместо того, чтобы копировать и вставлять его.
Рикардо ван ден Брук,
Вы также можете использовать onCreate () только для раздувания представлений и создания экземпляров глобальных переменных и использовать onStart () для их назначения / (пере) установки. Таким образом, ваш init () (или как вы его хотите называть) будет вызываться всякий раз, когда начинается действие; т.е. после onCreate () или после onRestart ().
jwehrle
Это действительно полезно, если вам нужно повторно инициализировать ViewModel ваших действий. Позволяет снова
получать данные
34

в основном:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}
Hamze Shoae
источник
Я предполагаю, что это относится к текущему действию, а не к предыдущему действию?
Si8,
1
У меня была такая же проблема, за исключением того, что у меня был фрагмент, а не действие. Таким образом, я следую совету здесь, и он сработал: stackoverflow.com/questions/35039512/…
Дэвид С.
8

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

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

слепой
источник
2

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

В предыдущем упражнении, где вы хотите обновить:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}
То Минь Тьен
источник
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();
    }
}

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

Айжан Несипбаева
источник
рассмотрите возможность добавления некоторых пояснений
Гаан
1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

В предыдущем упражнении используйте этот код. Это сделает плавный переход и перезагрузит активность, когда вы вернетесь, нажав кнопку «Назад».

Робиул Хоссейн Шах Имран
источник
Можете ли вы добавить описание к коду и поблагодарить вас за сообщение.
Неллес
0

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

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

(Также стоит посмотреть, как Notepad Tutorial обрабатывает то, что вы делаете, хотя и использует базу данных.)

Танский гимн
источник
0

Думаю, лучший способ сделать это - использовать

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);
Флавио Кандидо
источник
0

Попробуй это

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

Это оно...

Рахул
источник
0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}
Сайед Заиди
источник
Этому вопросу несколько лет, и предоставленный ответ был помечен для проверки как сообщение низкого качества. Вот несколько советов о том, как написать хороший ответ? . Есть и другие ответы, которые содержат вопрос OP, и они были опубликованы некоторое время назад. Публикуя ответ, убедитесь, что вы добавили либо новое решение, либо существенно лучшее объяснение, особенно при ответах на старые вопросы.
help-info.de