Как заменить startActivityForResult на ActivityResultLauncher, но при этом включить пакет опций?

#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