@archduke

Как управлять состоянием Activity, внутри onActivityResult после вызова startActivityForResult?

Например, есть список элементов внутри RecyclerView. И нужно добавить фотографию для определенного элемента в списке после клика по нему. Как это сделать наиболее коректно, чтоб внутри onActivityResult можно было доставить фотографию к элементу по позиции, которая была нажата.
Мне известен только один вариант, это держать нажатую позицию внутри переменной у Activity, и использовать ее в onActivityResult. Но возможно, есть подход который позволяет избежать создание и управление дополнительным стейтом в Activity?
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Если не хочется хранить состояние, можно передавать идентификатор элемента туда-обратно в интентах:

1. При вызове startActivityForResult добавляем в интент идентификатор элемента.
2. При возврате результата методом setResult() добавляем в интент кроме фотографии, еще и идентификатор, полученный ранее.
3. При обработке полученного результата в onActivityResult() получаем из интента фотографию и идентификатор элемента.

UPD:
Признаться, у меня для подобных задач реализован более удобный API.
При вызове startActivityForResult() сразу передаю обработчик результата.
А вся работа с requestCode скрыта в черном ящике.

public class ShellActivity extends AppCompatActivity {

    public interface ActivityResultHandler {
        void onActivityResult(int resultCode, Intent intent);
    }

    public void startActivityForResult(Intent intent, ActivityResultHandler handler) {
        // implementation
    }
}

Upd 2. А в Kotlin-е еще интереснее получается, вызов в одну сроку:
/**
 * Возвращает Intent (если RESULT_OK), либо null (если RESULT_CANCELED)
 * */
suspend fun ShellActivity.startActivityForResult(request: Intent): Intent? {
    return suspendCoroutine {
        this.startActivityForResult(request) { resultCode, response ->
            if (resultCode == RESULT_OK) {
                it.resume(response!!)
            } else {
                it.resume(null)
            }
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Где-то должна быть сущность(например, презентер, интерактор), которая хочет обновить список. Она должна иметь возможность ждать события возврата результата с помощью, например, листенера или подписки на стрим таких событий. Активити(или фрагмент) при получении результата оповещает все такие сущности по цепочке. Связывать конкретное событие с конкретным подписчиком можно с помощью requestCode. Как-то так, идея, надеюсь, понятна, остальное - детали реализации. Главное, хорошо абстрагировать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы