#android #onactivityresult
#Android #onactivityresult
Вопрос:
startActivityForResult(intent: Intent!, options: Bundle?)
устарел. Я пытаюсь заменить на ActivityResultLauncher
, но мне нужно передать options
. Как я могу сделать это с помощью нового метода? Ниже приведен пример оригинального (теперь устаревшего) метода, который открывает меню контактов, а затем выполняет одно из двух действий в коммутаторе на основе значения code
:
...
val code = contactType //can be either 1 or 2
val contactsIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
contactsIntent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
startActivityForResult(contactsIntent, code)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if(resultCode == Activity.RESULT_OK) {
when(requestCode) {
1 -> { //Do something
}
2 -> { //Do something else
}
}
}
}
Я пытался преобразовать приведенное выше для использования ActivityResultLauncher
, но я не понял, как передать ему значение code
. Ниже то, что у меня есть до сих пор:
val code = contactType //can be either 1 or 2
val contactsIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
contactsIntent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
contactLauncher.launch(contactsIntent) //or maybe contactLauncher.launch(contactsIntent, code)?
private val contactLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if(it.resultCode == Activity.RESULT_OK) {
when(??? requestCode ???) {
1 -> { //Do something
}
2 -> { //Do something else
}
}
}
}
Комментарии:
1. Я думаю, идея в том, что вы бы использовали два отдельных
ActivityResultLauncher
объекта, по одному для каждого сценария.
Ответ №1:
В этой ситуации вам нужно будет создать два отдельных объекта ActivityResultLauncher, по одному для каждого случая.
ИМО, это именно то, что Google пытался решить, имея загроможденную функцию «onActivityResult», а также имея дело с кодами запросов. Прямо сейчас это больше похоже на обратный вызов типа OnClickListener.
Они сделали то же самое с другими частями Android, например, запросили разрешения приложения. Код запроса теперь обрабатывается внутри.
Комментарии:
1. И до того, как вам понадобился один int, а теперь 3 объекта, это именно то, что они делают — я называю это перепроектированием, ИМХО.
2. Я называю это разделением проблем, но я думаю, это зависит от того, как вы их используете.
Ответ №2:
Перегруженная версия ‘launch ()’ позволяет передавать ‘ActivityOptionsCompat’ в дополнение к вводу.
@смотрите: https://developer.android.com/reference/androidx/activity/result/ActivityResultLauncher