AndroidActivityResultsAPI代替onActivityResult处理页面数据
onActivityResult
@SuppressWarnings("deprecation")
@Override
@CallSuper
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
mFragments.noteStateNotSaved();
super.onActivityResult(requestCode, resultCode, data);
}
Activity Results API的使用
在最新beta版本中谷歌推荐使用Activity Results API来处理页面数据的处理。通过新的 Activity Result API,我们可以单独的类中处理结果回调,真正做到 单一职责 。
1.在app下的build.gradle中加入依赖:
implementation 'androidx.activity:activity-ktx:1.2.0-beta01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'
2.自定义ActivityResultContract
自定义ActivityResultContract,用来处理两个activity互传数据的处理,替代onActivityResult方法 其中ActivityResultContract<String, String>第一个泛型参数表示输入的参数类型,即要带到下一个Activity的数据类型, 第二个泛型参数表示输出参数类型,即第二个Activity回传第一个Activity的数据类型。
class CustomActivityResultContract : ActivityResultContract<String, String>() {
override fun createIntent(context: Context, input: String?): Intent {
//要传到下一个activity中的数据,从A activity中带到B activity中的数据。
return Intent(context, SecondActivity::class.java).putExtra("name", input)
}
override fun parseResult(resultCode: Int, intent: Intent?): String {
//从activity回传的数据
val result = intent?.getStringExtra("result") //从B activity中回传的数据。
if (resultCode == Activity.RESULT_OK && result != null) {
return "$result"
}
return ""
}
}
3.注册ActivityResult协议
在A activity中注册ActivityResult协议,使用我们刚刚定义的CustomActivityResultContract。
registerForActivityResult方法有两个参数,第一个参数是传入对应的Contract,第二个参数是回调结果callback。
private val activityLauncher = registerForActivityResult(CustomActivityResultContract()) {
//第二个页面关闭后回到第一个页面的回调方法
tvName.text = it
}
4.调用launch方法开启界面跳转
使用第三步我们生成的启动器对象的launch方法来启动界面跳转,launch方法需要传入一个输入参数,也就是需要带到下一个页面的参数,可以是任意对象:
btnStartSecond.setOnClickListener {
//点击跳转到SecondActivity
activityLauncher.launch("我是第一个页面传过去的参数")
}
5.使用谷歌内置的 ActivityResultContract来进行页面跳转
还可以通过ActivityResultContracts类来调用谷歌为我们内置的Contract,其中包含来各种常用的Contract
- @StartActivityForResult: 通用的Contract,不做任何转换,Intent作为输入,ActivityResult作为输出,这也是最常用的一个协定。
- @RequestMultiplePermissions: 用于请求一组权限
- @RequestPermission: 用于请求单个权限
- @TakePicturePreview: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值为Bitmap图片
- @TakePicture: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,并将图片保存到给定的Uri地址,返回true表示保存成功。
- @TakeVideo: 调用MediaStore.ACTION_VIDEO_CAPTURE 拍摄视频,保存到给定的Uri地址,返回一张缩略图。
- @PickContact: 从通讯录APP获取联系人
- @GetContent: 提示用选择一条内容,返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址(content://形式) 。默认情况下,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的内容。
- @CreateDocument: 提示用户选择一个文档,返回一个(file:/http:/content:)开头的Uri。
- @OpenMultipleDocuments: 提示用户选择文档(可以选择多个),分别返回它们的Uri,以List的形式。
- @OpenDocumentTree: 提示用户选择一个目录,并返回用户选择的作为一个Uri返回,应用程序可以完全管理返回目录中的文档。
一般情况下使用StartActivityForResult就可以满足大部分需求啦。
private val activityResultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val result = intent?.getStringExtra("result")
tvName.text = result
}
}
btnStartSecond.setOnClickListener {
//点击跳转到SecondActivity
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("name", "我是第一个页面传过去的参数")
activityResultLauncher.launch(intent)
}
使用系统内置的ActivityResultContract可以很方便的实现页面间传值来,这样也可以实现解偶操作了。
到此这篇关于Android Activity Results API代替onActivityResult处理页面数据的文章就介绍到这了,更多相关Android Activity Results API内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341