android - обновить родительскую активность, когда дочерняя активность заканчивается

У меня есть родительская активность, которая запускает дочернюю активность.

В детской деятельности я занимаюсь:

toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Ride");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Когда я нажимаю кнопку Home/Up, я finish активность.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        finish();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

И кроме того, я делаю finish В еще одном месте в Детском Деятельности, и в обоих местах, где у меня есть finish, это восходит к родительской активности.

Мой вопрос:

Моя проблема в том, что я хочу обновить Родительскую активность только в случае одного из finishes,

Когда я выполняю финишную операцию не с помощью кнопки "Вверх" - данные в "Родительской активности" изменяются, поэтому - когда я нажимаю кнопку "Назад / Вверх", нет необходимости обновлять " Родителя", но когда я выполняю другую finishЯ хочу обновить Родителя.

Как я могу это обнаружить?

6 ответов

Решение

Начните детскую деятельность как

startActivityForResult(intent, requestCode)

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

И в onActivityResult(..) родительской активности получить статус и убить родительскую активность в нужном случае.

В родительской деятельности

startActivityForResult(Intent intent, int REQUEST_CODE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
case RESULT_OK:
    //refresh parentAcitivty  
    //get the result from the Up button back
    //e.g adapter.notifydatasetchanged()
case RESULT_CANCEL:
    //Do nothing 
    //return from childActivity by other finishes

В ChildActivity

case 1: //**from the Up button**
   setResult(RESULT_CANCEL);
   finish();
case 2: //**do the other finish**
   setResult(RESULT_OK);
   finish();

Я надеюсь, что код даст вам подсказку.

В этом случае используйте onResume,

@Override
protected void onResume() {
    super.onResume();
    // your code (for example: initialize(); etc.. )
}

Если вы обратитесь к этой статье, вы поймете, почему.

жизненный цикл активности Android

У вас есть метод finish() в двух местах, как описано. Одна - это кнопка "Назад" на панели действий (пусть она будет называться AbBack), а другая - в каком-то другом месте (RandomBack).

Пусть A будет основным действием, а B будет дочерним действием.

В A вместо метода startActivity() используйте

startActivityForResult(Intent intent, int REQUEST_CODE);

Это сделано для того, чтобы действие B после завершения могло возвращать данные в это действие, и в зависимости от данных вы можете обновлять / не обновлять

Итак, в упражнении B

В случае AbBack, вызовите этот метод setResult (RESULT_OK); и для RandomBack вызовите setResult (RESULT_CANCELED);

Наконец, в упражнении А вы должны переопределить метод

onActivityResult(int requestCode, int resultCode, In данные палатки)

где вы можете сравнить resultCode == RESULT_OK, и если это так, это означает, что данные взяты из AbBack или, если нет, из RandomBack, и выполнить необходимое обновление.

Используйте NavUtils.navigateUpFromSameTask(это); Функция onBackPressed так:

@Override
public void onBackPressed() {
    super.onBackPressed();
    NavUtils.navigateUpFromSameTask(this);
}

Попробуйте использовать navigateUpFromTask()

Другие вопросы по тегам