我试图在片段中实现两个不同的按钮,它们以不同的方式获取位置,它们都需要访问location权限运行时(在M上面的较新版本中),每个按钮都必须执行另一个操作。我根据需要设置调用WantedAction或WantedAction2的侦听器。我的基本代码来演示我的问题,请:
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)
}
}
}是否可以将参数发送到requestPermissionWantedActionLauncher或requestPermissionWantedAction2Launcher,以便执行函数调用,请允许我将它们组合起来?
提前感谢
发布于 2022-01-24 03:17:20
我不认为有办法把他们合并。只使用单个启动程序可以做的是创建一个单独的属性,该属性告诉它在被授予时应该做什么。
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函数,都应该首先将属性设置为应该调用的函数,例如:
postLocationPermissionGrantedAction = ::wantedAction
requestLocationPermission()发布于 2022-01-24 03:29:24
你可以试试这个:
扩展ActivityResultCallback<T>
启动前registerForActivityResult
的属性(BE 218)分配一个lambda
这样,您可以在每次启动时传递您想要的任何lambda (不需要标志)。
示例:
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<>()在活动代码中:
activityResultSingleLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission(), singleWrapper)
singleWrapper.callback = {//your lambda}
activityResultSingleLauncher.launch(permission)它应该类似于上面的内容(目前我无法访问我自己的代码,所以如果您遇到错误,请告诉我)。
https://stackoverflow.com/questions/70826641
复制相似问题