Кнопка "Назад" та оновлення попередньої активності


84

Якщо ми маємо два напрямки діяльності:

  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
     }

Або ви можете розпочати діяльність за результатами:

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

а що, якщо я не хочу закінчувати поточну діяльність і хочу, щоб попередня активність була оновлена
Mansuu ....

@Waza_Be onResumeне закликали мене, будь-яка ідея чому? ( Я пробував onRestartі onPauseтеж, але ніхто з них не дзвонив )
Мехді Деггані

У моєму випадку я перейшов до Activity from Fragment. Отже, повертаючись із Activity до фрагмента, оскільки інші відповіді згадують onRestart (), який не міститься у Fragment, отже, ця відповідь спрацювала для мене. Для Фрагменту ви можете використовувати onResume ().
Фероз-хан,

39

Я думаю, що 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 () (наприклад, відновлення інтерфейсу користувача з оновленими значеннями).


7
Це тривіально, але я повинен сказати це: очевидно, було б краще перенести свій код onCreate () в окремий метод, який ви потім викликаєте як з onCreate (), так і з onRestart (), замість того, щоб копіювати його.
Рікардо ван ден Брук,

Ви також можете використовувати onCreate () лише для роздування поглядів та створення екземплярів глобальних змінних та використання onStart () для їх призначення / (пере) встановлення. Таким чином, ваш init () (або як би ви його не називали) буде викликатися щоразу, коли починається дія; тобто після onCreate () або після onRestart ().
jwehrle

Це дійсно корисно, якщо вам потрібно повторно ініціалізувати ViewModel ваших дій. Дозволяє знову витягувати з бази даних, налаштовувати змінні екземпляра ...
величезно

34

в основному:

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

Я думаю, це стосується поточної діяльності, а не попередньої?
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();
    }
}

У мене просто є категорія обраного, тому, коли я натискаю на елемент із вибраного, з'являється така інформація, і якщо мені це не подобається - цей елемент слід видалити з "Вибраного": для цього я оновлюю базу даних і встановлюю її на адаптер (для перегляду) [Бажаю вам зрозумію мою проблему та рішення]


подумайте про додавання деяких пояснень
Гаан,

1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

У попередній діяльності використовуйте цей код. Це зробить плавний перехід і перезавантажить діяльність, коли ви повернетесь, натиснувши кнопку назад.


Чи можете ви додати якийсь опис до коду та подякувати за допис.
Неллес

0

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

У будь-якому випадку, ознайомтесь із життєвим циклом Діяльності . Крім того, зверніть увагу на методи onRestoreInstanceState та onSaveInstanceState, які не відображаються на гарній діаграмі життєвого циклу.

(Крім того, варто переглянути, як підручник з Блокнота обробляє те, що ви робите, хоча він використовує базу даних.)


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

}

І додайте цей метод до свого onBackPress (), як

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

Це воно...


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

Цьому питанню кілька років тому, і надана відповідь була позначена для розгляду як повідомлення низької якості. Ось декілька вказівок щодо того, як написати хорошу відповідь? . Є й інші відповіді, які надають питання ОП, і вони були опубліковані деякий час тому. Розміщуючи відповідь, будь ласка, переконайтесь, що ви додали або нове рішення, або значно кращі пояснення, особливо при відповіді на старіші запитання.
help-info.de
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.