В своей деятельности я называю второе действие из основного действия startActivityForResult
. В моем втором задании есть несколько методов, которые завершают это задание (возможно, без результата), однако только один из них возвращает результат.
Например, из основного занятия я называю второе. В этом упражнении я проверяю некоторые функции телефона, такие как наличие камеры. Если этого не произойдет, я закрою это занятие. Кроме того, во время подготовки MediaRecorder
или, MediaPlayer
если возникнет проблема, я закрою это действие.
Если на его устройстве есть камера и запись завершена полностью, то после записи видео, если пользователь нажмет кнопку «Готово», я отправлю результат (адрес записанного видео) обратно в основное действие.
Как я могу проверить результат основной деятельности?
Ответы:
С вашего
FirstActivity
звонкаSecondActivity
используяstartActivityForResult()
методНапример:
В вашем
SecondActivity
наборе данные, которые вы хотите вернуть обратноFirstActivity
. Если вы не хотите возвращаться, не устанавливайте ничего.Например:
SecondActivity
если вы хотите отправить данные обратно:Если вы не хотите возвращать данные:
Теперь в вашем
FirstActivity
классе напишите следующий код дляonActivityResult()
метода.Для более эффективной реализации передачи данных между двумя действиями в Котлине перейдите по этой ссылке « Лучший способ передачи данных между действиями ».
источник
SecondActivity
произошло какое-то исключение, в этом случае вам также нужно вернуть результат вFirstActivity
, чтобы вы могли установить результат, как"RESULT_CANCELLED"
в блоке catch, и вернуться к,FirstActivty
иFirstActivity's' 'onActivityResult()
вы можете проверить, получили ли вы результат успеха или неудачи.Вам нужно переопределить, а
Activity.onActivityResult()
затем проверить его параметры:requestCode
определяет, какое приложение вернуло эти результаты. Это определяется вами, когда вы звонитеstartActivityForResult()
.resultCode
информирует вас о том, успешно ли это приложение завершилось неудачно или что-то другоеdata
содержит любую информацию, возвращенную этим приложением. Это может бытьnull
.источник
В дополнение к ответу от @ Nishant, лучший способ вернуть результат активности:
У меня были проблемы с
Тогда я узнал, что правильный путь использует
чтобы получить текущее намерение
источник
Intent
который существует только для хранения aBundle
и не имеет нормальных значений, таких как действие или компонент. Но также немного странно (и потенциально опасно?) Изменять то,Intent
что использовалось для запуска текущего действия. Поэтому я искал источник для самого Android и обнаружил, что они всегда создают новыйIntent
для использования в качестве результата. Например, github.com/aosp-mirror/platform_frameworks_base/blob/…getIntent()
кажется идеальным способом вернуть данные в неизвестное действие, откуда оно было вызвано. Спасибо!пример
Чтобы увидеть весь процесс в контексте, вот дополнительный ответ. Смотрите мой более полный ответ для более подробного объяснения.
MainActivity.java
SecondActivity.java
источник
Для тех, у кого проблема с неправильным requestCode в onActivityResult
Если вы звоните
startActivityForResult()
со своегоFragment
, код запроса изменяется Деятельностью, которой принадлежит Фрагмент.Если вы хотите получить правильный код результата в вашей деятельности, попробуйте это:
Изменить:
startActivityForResult(intent, 1);
Для того, чтобы:getActivity().startActivityForResult(intent, 1);
источник
Если вы хотите обновить пользовательский интерфейс с результатом активности, вы не можете использовать. В
this.runOnUiThread(new Runnable() {}
этом случае пользовательский интерфейс не обновится с новым значением. Вместо этого вы можете сделать это:Это кажется глупым, но работает довольно хорошо.
источник
Сначала вы используете
startActivityForResult()
сначала параметры,Activity
а если вы хотите отправить данные со второгоActivity
на первое,Activity
то передайте значение сIntent
помощьюsetResult()
метода и получите эти данные внутриonActivityResult()
метода первымActivity
.источник
Очень распространенная проблема в Android
Это может быть разбито на 3 части
1) начать действие B (происходит в упражнении A)
2) установить запрашиваемые данные (происходит в упражнении B)
3) получить запрошенные данные (происходит в упражнении A)
В этой части вы решаете, хотите ли вы отправлять данные обратно или нет, когда происходит определенное событие.
Например: в действии B есть EditText и две кнопки b1, b2.
Нажатие на кнопку b1 отправляет данные обратно в действие.
Нажатие на кнопку b2 не отправляет никаких данных.
Отправка данных
Не отправка данных
пользователь нажимает кнопку «назад».
По умолчанию результат устанавливается с кодом ответа Activity.RESULT_CANCEL.
Для этого переопределить метод onActivityResult
источник
ActivityResultRegistry - рекомендуемый подход
ComponentActivity
теперь предоставляет,ActivityResultRegistry
который позволяет вам обрабатывать потокиstartActivityForResult()
+,onActivityResult()
а такжеrequestPermissions()
+onRequestPermissionsResult()
без переопределения методов в вашемActivity
илиFragment
, обеспечивает повышенную безопасность типов черезActivityResultContract
и предоставляет ловушки для тестирования этих потоков.Настоятельно рекомендуется использовать API Result Activity, представленные в AndroidX Activity 1.2.0-alpha02 и Fragment 1.3.0-alpha02.
Добавьте это к вашему
build.gradle
Как использовать готовый договор?
Этот новый API имеет следующие встроенные функции
Пример, использующий контракт takePicture:
Так что здесь происходит? Давайте разберемся с этим немного.
takePicture
это просто обратный вызов, который возвращает обнуляемое растровое изображение - независимо от того, является ли оно пустым, зависит от того, был лиonActivityResult
процесс успешным.prepareCall
затем регистрирует этот вызов в новой функцииComponentActivity
под названиемActivityResultRegistry
- мы вернемся к этому позже.ActivityResultContracts.TakePicture()
является одним из встроенных помощников, которые Google создал для нас, и, наконец, вызов наtakePicture
самом деле запускает Намерение так же, как ранееActivity.startActivityForResult(intent, REQUEST_CODE)
.Как написать заказной договор?
Простой контракт, который принимает Int в качестве входных данных и возвращает строку, запрошенную Activity, возвращается в результате Intent.
Проверьте эту официальную документацию для получения дополнительной информации.
источник
источник