Awesome
Inline Activity Result
Table of Contents
Core
Gradle Dependency
dependencies {
...
implementation 'com.afollestad.inline-activity-result:core:0.2.0'
}
Usage
You call startActivityForResult
, providing the Activity to launch as the generic type. You
receive the result in a callback without having to override onActivityResult
. And, you don't
have to worry about requestCode
or resultCode
.
class NewActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val extras = Bundle()
.putString("some_extra", "Hello, World!")
startActivityForResult<OtherActivity>(extras) { success, data ->
if (success) {
toast("Got successful result: $data")
}
}
}
}
There are multiple variants startActivityForResult
you can use for different use cases. All of
them allow you to pass an optional requestCode
parameter, but this should generally be unnecessary.
First, the simplest you can get is just a generic type and the callback.
startActivityForResult<OtherActivity> { success, data ->
// Do something
}
Second, you can provide a Bundle
of extras to the destination Activity:
val extras = Bundle()
.putString("some_extra", "Hello, World!")
startActivityForResult<OtherActivity>(extras) { success, data ->
// Do something
}
And finally, you can use a full intent. In this variant you do not provide a generic parameter.
val intent = Intent(Intent.ACTION_VIEW)
.setData("content://some-uri".toUri())
startActivityForResult(intent) { success, data ->
// Do something
}
Coroutines
Gradle Dependency
dependencies {
...
implementation 'com.afollestad.inline-activity-result:coroutines:0.2.0'
}
Usage
You can use Kotlin coroutines to get rid of the callback. It of course is a suspend function so it must be called within a coroutine scope.
Instead of startActivityForResult
, you can use startActivityAwaitResult
:
val result: ActivityResult = startActivityAwaitResult<OtherActivity>()
// use result...
RxJava
Gradle Dependency
dependencies {
...
implementation 'com.afollestad.inline-activity-result:rxjava:0.2.0'
}
Usage
You can use RxJava to integrate the Activity launch and result into your streams.
Instead of startActivityForResult
, you can use startActivityEmitResult
:
val disposable = startActivityEmitResult<OtherActivity>()
.subscribe { result ->
// use result...
}
// make sure you dispose of the subscription when your Activity/Fragment goes away
disposable.dispose()