如何在作文中获得活动

问题描述

有没有一种方法可以使当前活动处于撰写功能中?

@Composable
fun CameraPreviewScreen() {
    val context = ContextAmbient.current
    if (ActivityCompat.checkSelfPermission(
            context,Manifest.permission.CAMERA
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            this,MainActivity.required_PERMISSIONS,MainActivity.REQUEST_CODE_PERMISSIONS  // get activity for `this`
        )
        return
    }
}

解决方法

虽然上一个答案(def resource_path(relative_path: str) -> str: try: base_path = sys._MEIPASS except Exception: base_path = os.path.dirname(__file__) return os.path.join(base_path,relative_path) browser = webdriver.Chrome(resource_path('drivers/chromedriver')) browser.get(link) -aware)确实是正确的, 我想提供一个更惯用的实现来复制粘贴。

ContextWrapper

由于 fun Context.getActivity(): AppCompatActivity? = when (this) { is AppCompatActivity -> this is ContextWrapper -> baseContext.getActivity() else -> null } 不可能将彼此包裹显着 次,因此递归在这里很好。

,

获取上下文

val context = LocalContext.current

然后使用上下文获取活动。创建一个扩展函数,并使用您的上下文调用此扩展函数,例如 context.getActivity()

fun Context.getActivity(): AppCompatActivity? {
  var currentContext = this
  while (currentContext is ContextWrapper) {
       if (currentContext is AppCompatActivity) {
            return currentContext
       }
       currentContext = currentContext.baseContext
  }
  return null
}
,

您可以从投射上下文的可组合对象中获取活动(我还没有找到一种情况,即上下文不是活动)。但是,吉姆已经提到,这样做不是一个好习惯。

val activity = AmbientContext.context as Activity

当我只是在玩一些需要活动的代码(权限是一个很好的例子)时,我个人使用它,但是一旦使它起作用,我就将其移至活动并使用参数/回调。 / p>

,

从Composable函数中获取活动被认为是不好的做法,因为您的composable不应与应用程序的其余部分紧密结合。除其他外,紧密的耦合将阻止您对组合物进行单元测试,并通常使重用变得更加困难。

查看您的代码,看起来您正在从可组合体内请求权限。再一次,这不是您想要在可组合对象内部执行的操作,因为可组合函数可以在每个框架中运行的频率相同,这意味着您将在每个框架中不断调用该函数。

相反,请在活动中设置相机权限,并通过参数传递(通过参数)可合成对象所需的任何信息以渲染像素。