Android
主页 > 软件编程 > Android >

Android Activity Results API代替onActivityResult处理页面数据

2022-09-07 | 佚名 | 点击:

onActivityResult

1

2

3

4

5

6

7

@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的数据类型。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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。

1

2

3

4

private val activityLauncher = registerForActivityResult(CustomActivityResultContract()) {

        //第二个页面关闭后回到第一个页面的回调方法

        tvName.text = it

    }

4.调用launch方法开启界面跳转

使用第三步我们生成的启动器对象的launch方法来启动界面跳转,launch方法需要传入一个输入参数,也就是需要带到下一个页面的参数,可以是任意对象:

1

2

3

4

btnStartSecond.setOnClickListener {

           //点击跳转到SecondActivity

           activityLauncher.launch("我是第一个页面传过去的参数")

       }

5.使用谷歌内置的 ActivityResultContract来进行页面跳转

还可以通过ActivityResultContracts类来调用谷歌为我们内置的Contract,其中包含来各种常用的Contract

一般情况下使用StartActivityForResult就可以满足大部分需求啦。

1

2

3

4

5

6

7

8

9

10

11

12

13

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可以很方便的实现页面间传值来,这样也可以实现解偶操作了。

原文链接:https://blog.csdn.net/cj641809386/article/details/109363834
相关文章
最新更新