Главная » Разработка для Android » Возвращение результатов из Активностей

0

Активность, запущенная с помощью метода startActivity, теряет зависи- мость от «родителя» и не возвращает  никаких результатов при закрытии.

Вы можете запустить Активность в виде дочернего объекта, неразрывно связанного  с родительским экземпляром. При закрытии дочерняя  Актив- ность инициирует срабатывание  обработчика  внутри родительской. Такой механизм  идеально  подходит  в ситуациях,  когда одна Активность предо- ставляет  возможность ввода данных (например, выбор элемента  списка пользователем) для другой.

Дочерние  Активности отличаются  от любых других способом запуска. Они должны быть зарегистрированы в манифесте приложения. Фактически любая Активность, упоминающаяся в манифесте, может стать дочерней. Это относится и к системным, и к сторонним  Активностям.

Запуск дочерних Активностей. Метод startActivityForResult  работает так же, как и startActivity, но с одним важным  отличием.  Помимо  явных или неявных Намерений, используемых для определения нужной Активности, вы также можете передавать код запроса. Позже это значение применяется для однозначной  идентификации дочерней  Активности, которая  вернула результат.

Каркас для запуска дочерней Активности показан в листинге 5.3.

Листинг 5.3. Запуск  Активности,  которая должна вернуть результат

private static final int SHOW_SUBACTIVITY = 1;

Intent intent = new Intent(this, MyOtherActivity.class);

startActivityForResult(intent, SHOW_SUBACTIVITY);

Дочерняя Активность, как и любая другая, может быть запущена явным и неявным образом. В листинге 5.4, чтобы запустить Активность для выбора контакта, используется неявное Намерение.

Листинг 5.4. Неявный запуск Активности,  которая должна вернуть результат

private static final int PICK_CONTACT_SUBACTIVITY = 2;

Uri uri = Uri.parse("content://contacts/people"); Intent intent = new Intent(Intent.ACTION_PICK, uri); startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);

Возвращение  результатов. Когда дочерняя  Активность готова вернуть результат, прежде чем завершать ее работу с помощью функции finish, вы- зовите метод setResult. Он принимает два параметра: результирующий код и сам результат, представленный в виде Намерения.

Результирующий код говорит  о том, с каким  результатом заверши- лась работа Активности, как правило, это либо Activity.RESULT_OK, либо Activity.RESULT_CANCELED. В некоторых случаях нужно использовать собственный  код возврата для обработки специфических для вашего при- ложения  вариантов.  Метод setResult поддерживает любое целочисленное значение.

Намерение, возвращаемое в качестве результата, часто включает путь URI к части содержимого (например, к выбранному контакту, телефонному но- меру или медиафайлу) и набор значений в параметре extras, используемых для передачи дополнительной информации.

Листинг 5.5 представляет собой часть метода onCreate из дочерней Актив- ности и показывает, как кнопки OK и Cancel могут возвращать в родительский компонент  приложения разные результаты.

Листинг 5.5. Создание новых Общих настроек

Button okButton = (Button) findViewById(R.id.ok_button);

okButton.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) {

Uri data = Uri.parse("content://horses/" + selected_horse_id);

Intent result = new Intent(null, data);

Продолжение ?

Листинг 5.5 (продолжение)

result.putExtra(IS_INPUT_CORRECT, inputCorrect); result.putExtra(SELECTED_PISTOL, selectedPistol); setResult(RESULT_OK, result);

finish();

}

});

Button cancelButton = (Button) findViewById(R.id.cancel_button);

cancelButton.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) { setResult(RESULT_CANCELED, null); finish();

}

});

Если Активность была закрыта пользователем при нажатии аппаратной кнопки  возврата  или если метод finish был вызван  раньше, чем setResult, результирующий код установится в RESULT_CANCELED, а возвращенное Намерение покажет значение null.

Обработка результатов, возвращаемых из дочерних Активностей. При закрытии дочерней Активности внутри родительского компонента срабаты- вает обработчик  onActivityResult. Переопределите данный  метод, чтобы обрабатывать  результаты,  возвращаемые дочерней Активностью.

Обработчик onActivityResult принимает  несколько параметров.

• Код запроса.  Код, который  использовался для запуска  Активности, возвращающей результат.

• Результирующий код. Код результата,  устанавливаемый дочерней Активностью и указывающий, как завершилась ее работа. Это может быть любое целочисленное значение, но, как правило, либо Activity. RESULT_OK, либо Activity.RESULT_CANCELED.

ПРИМЕЧАНИЕ

Если работа дочерней Активности завершилась непредвиденно или если перед ее закрытием не был указан код результата, этот параметр станет равен Activity.RESULT_CANCELED.

• Данные. Намерение, используемое  для упаковки  возвращаемых дан- ных. В зависимости от назначения дочерней  Активности оно может включать путь URI, представляющий выбранную часть содержимого. В качестве альтернативы (или дополнения) дочерняя  Активность мо- жет возвращать информацию в виде простых значений, упакованных в параметр Намерения extras.

В листинге  5.6 показан  каркас  для реализации обработчика  событий onActivityResult, размещенного внутри Активности.

Листинг 5.6. Реализация обработчика  onActivityResult

private static final int SHOW_SUB_ACTIVITY_ONE = 1;

private static final int SHOW_SUB_ACTIVITY_TWO = 2;

@Override

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

super.onActivityResult(requestCode, resultCode, data);

switch(requestCode) {

case (SHOW_SUB_ACTIVITY_ONE) : {

if (resultCode == Activity.RESULT_OK) { Uri horse = data.getData();

boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT,

false);

}

String selectedPistol = data.getStringExtra(SELECTED_PISTOL);

break;

}

case (SHOW_SUB_ACTIVITY_TWO) : {

if (resultCode == Activity.RESULT_OK) {

// TODO: Обработка нажатия кнопки OK.

}

break;

}

}

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии