【问题标题】:deprecated OnActivityResult() in androidx在 androidx 中弃用 OnActivityResult()
【发布时间】:2021-03-17 09:02:59
【问题描述】:

OnActivityResult() 在 androidx 中已弃用。我从以下链接中获取了参考 https://developer.android.com/training/basics/intents/result https://developer.android.com/jetpack/androidx/releases/activity https://proandroiddev.com/is-onactivityresult-deprecated-in-activity-results-api-lets-deep-dive-into-it-302d5cf6edd 我在我的项目中实现了注册的东西 ..like 。我通过注册活动创建了结果合同 代替startActivityForResult 我被resultcontract.launch(intent) 替换并在resultcontract 中得到结果(按照上面的链接)。现在我对打开 gps 的一项功能表示怀疑。 为此我们使用了

 val rae = e as ResolvableApiException
    rae.startResolutionForResult(context, GPS_REQUEST)

以前是 startActivityForResult ,现在是 startResolutionForResult 对如何获取 gps 请求的结果感到困惑(在代码中,我们得到的结果是 onActivityResult)。我怎样才能用新的方式来实现呢?

【问题讨论】:

  • 我遇到了同样的问题,我们现在如何实现呢?你找到解决办法了吗?
  • 不,我仍在寻找解决方案。如果你发现任何,请告诉我。谢谢。
  • startResolutionForResult() 使用onActivityResult 来通知它,我们不能用新的Intents 方式替换它来提供同等的解决方案。所以我现在保持相同的解决方案!我尽力了,但找不到其他方法。对不起

标签: android androidx deprecated onactivityresult startactivityforresult


【解决方案1】:

我找到了解决这个问题的方法,使用最近的 API 来启动结果。

因此,您几乎可以从 ResolvableApiException(这是一个 PendingIntent)中获取分辨率,并使用 StartIntentSenderForResult 合约启动它,就像这样

合同:

private val resolutionForResult =
        registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
            //do whatever you want with activity result...
        }

如何开始:

.addOnFailureListener { exception ->
    if (exception is ResolvableApiException) {
        try {
            val intentSenderRequest =
                IntentSenderRequest.Builder(exception.resolution).build()
            resolutionForResult.launch(intentSenderRequest)
        } catch (throwable: Throwable) {
            // Ignore the error.
        }
    }
}

【讨论】:

  • 好的。 ,如果你考虑我上面的代码,那么如何传递 GPS 请求?
  • 您不需要 GPS_REQUEST 常量,因为 resolutionForResult 合约是专门为获取 IntentSender 的结果而创建的。此回调为您提供一个 ActivityResult,其中包含您的数据(Intent)和 resultCode(Int)。我只是在回调 private val resolutionForResult = fragmentActivity.registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult -> if (activityResult.resultCode == Activity.RESULT_OK) { startRequestLocationUpdates() } } 上这样做
  • 好的,我明白了。非常感谢古斯塔沃。对 AutoResolveHelper.resolveTask(task, requireActivity(), SAVE_TO_WALLET) 的另一个疑问是我们发送 SAVE_TO_WALLET 请求并得到它的结果 onActivityResult , if (requestCode == SAVE_TO_WALLET) { sendActivityResult(requestCode, resultCode, data) } 怎么能我们使用新方法来实现这一点?
  • 在片段方法中初始化回调时不起作用,所以只能使用类级声明!
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 2021-03-25
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多