The recent movement in
Activity and Fragment
Wonyoung Choi
@TORU_0239
I am…
Wonyoung Choi, a.k.a Toru
Android Advocate,
Singapore Tourism Board
@TORU_0239
Github: TORU239
LinkedIn: linkedin.com/in/toruchoi
The latest changes
The latest changes
• Noteworthy changes in the latest alpha version
• Activity Results API in activity 1.2.0 alpha
• Fragment Result API in fragment 1.3.0 alpha
startActivityForResult()
onActivityResult()
onRequestPermissionsResult()
startActivityForResult()
onActivityResult()
onRequestPermissionsResult()
Deprecated on ComponentActivity
Activity Results API
• Deprecated method we have been familiar with.
• ActivityResultLauncher and ActivityResultContract
• Resolution for Tight Coupling, Type-Safety, Unwanted NPE
implementation 'androidx.activity:activity-ktx:1.2.0-alpha04'
import androidx.activity.result.contract.ActivityResultContracts.*
val requestActivity = registerForActivityResult(StartActivityForResult()){ activityResult ->
// Do what you want
}
binding.btn.setOnClickListener {
requestActivity(Intent(...))
}
import androidx.activity.result.contract.ActivityResultContracts.*
val requestActivity = registerForActivityResult(StartActivityForResult()){ activityResult ->
// Do what you want
}
binding.btn.setOnClickListener {
requestActivity(Intent(...))
}
ActivityResultLauncher ActivityResultContract
Activity Results API
• Available to get result returned like typical Intent
• e.g. Picking Image, Opening Camera using Intent
val pickImages = registerForActivityResult(GetContent()){ uri ->
...
}
binding.btnImagePick.setOnClickListener {
pickImages.launch("image/*")
}
Activity Results API
• Can handle permission dialog and callback
• Not only single permission but multiple one
val permission = registerForActivityResult(RequestPermission()){ enabled ->
// Do what you want
}
binding.btnPermission.setOnClickListener {
permission.launch(android.Manifest.permission.ACCESS_FINE_LOCATION)
}
val multiplePermission = registerForActivityResult(RequestMultiplePermissions()) { map ->
// Can do actions we want
}
binding.btnMultipermission.setOnClickListener {
multiplePermission(
arrayOf(
android.Manifest.permission.CAMERA,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)
)
}
CreateDocument()
GetContent()
GetMultipleContents()
OpenDocument()
OpenDocumentTree()
OpenMultipleDocuments()
PickContact()
RequestMultiplePermissions()
RequestPermission()
StartActivityForResult()
StartIntentSenderForResult()
TakePicture()
TakePicturePreview()
TakeVideo()
Activity Results API
Activity Results API
• Customisable ActivityResultContract
• When users need to implement features upon their purpose
val customContract = object:ActivityResultContract<String, ActivityResult>(){
override fun createIntent(
context: Context,
input: String?
): Intent {
return Intent(this@CurrentActivity, ResultActivity::class.java).putExtra("test", input)
}
override fun parseResult(
resultCode: Int,
intent: Intent?
): ActivityResult {
return ActivityResult(resultCode, intent)
}
}
val customContract = object:ActivityResultContract<String, ActivityResult>(){
override fun createIntent(
context: Context,
input: String?
): Intent {
return Intent(this@CurrentActivity, ResultActivity::class.java).putExtra("test", input)
}
override fun parseResult(
resultCode: Int,
intent: Intent?
): ActivityResult {
return ActivityResult(resultCode, intent)
}
}
val customActivity = registerForActivityResult(customContract){ activityResult->
// Can do whatever
}
Fragment Results API
• To pass data between Fragments
• No need sharedViewModel or Listener in Activity
• FragmentManager in responsible for working on this
Fragment Results API
implementation 'androidx.fragment:fragment-ktx:1.3.0-alpha04'
setFragmentResult("requestKey", bundleOf("key" to "value"))
fun Fragment.setFragmentResult(
requestKey: String,
result: Bundle?
) = parentFragmentManager.setFragmentResult(requestKey, result)
Sender Fragment
setFragmentResultListener("requestKey"){ resultKey, bundle ->
// Do whatever you want
}
fun Fragment.setFragmentResultListener(
requestKey: String,
listener: ((resultKey: String, bundle: Bundle) -> Unit)?
) {
parentFragmentManager.setFragmentResultListener(requestKey, this, listener)
}
Receiver Fragment
Fragment Results API
setFragmentResult("NESTED_REQUEST_KEY", bundleOf("key" to "value"))
fun Fragment.setFragmentResult(
requestKey: String,
result: Bundle?
) = parentFragmentManager.setFragmentResult(requestKey, result)
Child Fragment
childFragmentManager
.setFragmentResultListener(
"NESTED_REQUEST_KEY",
this,
FragmentResultListener { requestKey, result ->
// Whatever you want
}
)
Parent Fragment
Further Discussion
Limitations
•Still stays at alpha stage
•Possibilities of unexpected changes
Further Discussion
•Mechanism of API
•Receiving an activity result in a separate class
•Utilising and combine all the new components
Thank You!
Wonyoung Choi
@TORU_0239

activity_and_fragment_may_2020_lakopi