首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >registerForActivityResult执行函数作为参数

registerForActivityResult执行函数作为参数
EN

Stack Overflow用户
提问于 2022-01-23 21:13:26
回答 2查看 951关注 0票数 1

我试图在片段中实现两个不同的按钮,它们以不同的方式获取位置,它们都需要访问location权限运行时(在M上面的较新版本中),每个按钮都必须执行另一个操作。我根据需要设置调用WantedAction或WantedAction2的侦听器。我的基本代码来演示我的问题,请:

代码语言:javascript
复制
class MapFragment : Fragment() {
    private val requestPermissionWantedActionLauncher: ActivityResultLauncher<String> =
        registerForActivityResult(
            ActivityResultContracts.RequestPermission()
        ) { isGranted: Boolean ->
            if (isGranted)
                wantedAction()
        }

    private val requestPermissionWantedAction2Launcher =
        registerForActivityResult(
            ActivityResultContracts.RequestPermission()
        ) { isGranted: Boolean ->
            if (isGranted)
                wantedAction2()
        }

    private fun requestLocationPermission(op: ActivityResultLauncher<String>) {
        val permission =
            Manifest.permission.ACCESS_COARSE_LOCATION
        if (shouldShowRequestPermissionRationale(permission)) {
//tell user why this permission is needed
                op.launch(permission)
        } else {
            op.launch(permission)
        }
    }
}

是否可以将参数发送到requestPermissionWantedActionLauncherrequestPermissionWantedAction2Launcher,以便执行函数调用,请允许我将它们组合起来?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2022-01-24 03:17:20

我不认为有办法把他们合并。只使用单个启动程序可以做的是创建一个单独的属性,该属性告诉它在被授予时应该做什么。

代码语言:javascript
复制
private var postPermissionGrantedAction: (()->Unit)? = null
    
private val requestPermissionWantedActionLauncher: ActivityResultLauncher<String> =
    registerForActivityResult(
        ActivityResultContracts.RequestPermission()
    ) { isGranted: Boolean ->
        if (isGranted) postPermissionGrantedAction?.invoke()
    }

private fun requestLocationPermission() {
    val permission = Manifest.permission.ACCESS_COARSE_LOCATION
    if (shouldShowRequestPermissionRationale(permission)) {
        //tell user why this permission is needed
    }
    requestPermissionWantedActionLauncher.launch(permission)
}

然后,无论哪个代码调用您的requestLocationPermission函数,都应该首先将属性设置为应该调用的函数,例如:

代码语言:javascript
复制
postLocationPermissionGrantedAction = ::wantedAction
requestLocationPermission()
票数 0
EN

Stack Overflow用户

发布于 2022-01-24 03:29:24

你可以试试这个:

扩展ActivityResultCallback<T>

  • Which的
  • 创建一个类A,它将具有一个属性B,它将是A

启动前registerForActivityResult

  • Each时间的另一个-- A,为A

的属性(BE 218)分配一个lambda

这样,您可以在每次启动时传递您想要的任何lambda (不需要标志)。

示例:

代码语言:javascript
复制
import androidx.activity.result.ActivityResultCallback

class CallBackWrapper<T> : ActivityResultCallback<T> {
    var callback: ActivityResultCallback<T>? = null

    /**
     * Called when the result is available
     */
    override fun onActivityResult(result: T?) {
        callback?.onActivityResult(result);
    }
}

singleWrapper: CallBackWrapper<Boolean> = CallBackWrapper<>()

在活动代码中:

代码语言:javascript
复制
activityResultSingleLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission(), singleWrapper)
singleWrapper.callback = {//your lambda}
activityResultSingleLauncher.launch(permission)

它应该类似于上面的内容(目前我无法访问我自己的代码,所以如果您遇到错误,请告诉我)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70826641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档