当前位置:   article > 正文

【Android新版本兼容】startActivityForResult()方法被弃用的解决方案_startactivityforresult不能用了怎么办

startactivityforresult不能用了怎么办

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。

一、使用registerForActivityResult()方法

startActivityForResult()方法在appcompat库1.3.0或更高版本中被废弃了,在新版的AndroidX库中,startActivityForResult()也被标记为弃用。我们可以使用使用registerForActivityResult()方法来替代startActivityForResult()方法。
例如我们需要实现从FirstActivity页面跳转到SecondActivity页面,然后期望在SecondActivity页面被销毁时向FirstActivity页面返回结果和数据。那么我们的FirstActivity.kt可以这么写:

class FirstActivity: AppCompatActivity() {

    private lateinit var mBinding: ActivityFirstBinding

    private val requestDataLauncher =
        //注册ActivityResult的观察者 当启动的Activity返回结果时 这个观察者会被触发
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK) {
                val data = result.data?.getStringExtra("mData")
                Toast.makeText(this,data,Toast.LENGTH_SHORT).show()
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityFirstBinding.inflate(layoutInflater)
        setContentView(mBinding.root)
        mBinding.mButton1.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            //通过ActivityResult观察者启动一个Activity 并在其销毁后返回结果
            requestDataLauncher.launch(intent)
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

我们先是注册ActivityResult的观察者,当SecondActivity销毁并返回结果给FirstActivity时,这个观察者中就会被触发,然后会执行我们添加的代码逻辑。这里我们先判断SecondActivity是否处理成功,如果处理成功则将SecondActivity返回的数据用Toast显示出来。
接下来我们看一下如何让SecondActivity.kt在销毁时返回数据给FirstActivity:

class SecondActivity: AppCompatActivity() {

    private lateinit var mBinding: ActivitySecondBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivitySecondBinding.inflate(layoutInflater)
        setContentView(mBinding.root)
        mBinding.mButton2.setOnClickListener {
            val data = "This is data for FirstActivity!"
            val intent = Intent()
            // 将数据存放到intent中
            intent.putExtra("mData", data)
            setResult(RESULT_OK, intent)
            finish()
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在SecondActivity中当我们点击mButton2按钮时,首先将要传递的数据存放到intent中。然后通过setResult()方法将处理结果和带有数据的intent一起返回给FirstActivity,最后销毁SecondActivity。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/608845
推荐阅读
相关标签
  

闽ICP备14008679号