我正在尝试通过单击按钮(可组合函数)来启动文件选择器。无法使用
startActivityForResult()
。
@Composable
fun SelectScreen() {
Button(onClick = {
val intent = Intent(Intent.ACTION_GET_CONTENT)
startActivity(intent)
}
) {
Text("BUTTON")
}
}
这是我的建议:
val pickPictureLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.GetContent()
) { imageUri ->
if (imageUri != null) {
// Update the state with the Uri
}
}
// In your button's click
pickPictureLauncher.launch("image/*")
在显示图像的可组合项中,您可以执行以下操作
val image = remember {
// Make sure to resize and compress
// the image to avoid display a big bitmap
ImageUtils.imageFromUri(imageUi)
}
Image(
image,
contentDescription = null
)
rememberLauncherForActivityResult()
向由给定 Activity#startActivityForResult
指定的 ActivityResultContract
注册请求。
这会在与此调用者关联的
ActivityResultRegistry
中创建一条记录,管理请求代码,以及在后台与 Intent
之间的转换。
类似:
val result = remember { mutableStateOf<Uri?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) {
result.value = it
}
Button(onClick = { launcher.launch(arrayOf("image/*")) }) {
Text(text = "Open Document")
}
result.value?.let {
//...
}
在撰写中使用“startActivityForResult()”我找到了这个解决方案并且它对我有用
@Composable
fun SelectScreen() {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "*/*";
intent.addCategory(Intent.CATEGORY_OPENABLE);
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
Button(onClick = {
launcher.launch(intent)
}) {
Text(text = "Take a picture")
}
}
这不是答案,但
startActivity
仅在活动上下文中可用,而不是在组合中,您需要在某处解析context
才能使用它context.startActivity
。
对于
onActivityResult
有一种新方法可以做到,请查看:OnActivityResult 方法已弃用,有什么替代方法?
您必须从有效的上下文中开始一项活动, 这可能是您的应用程序上下文或活动。 如果您不需要从活动返回结果,这意味着您没有为结果启动活动,那么您也可以从应用程序上下文开始。
companion object{
var mContext : Context? = null
/*
* should set your mContext variable value to this in your activity onCreate, onStart
* and set to null in your onStop to avoid leaks
*/
fun getActivityContext() : Context{
return mContext;
}
fun getApplicationContext() : Context{
return ApplicationClass.getInstance()
}
}
@Composable
fun SelectScreen() {
Button(onClick = {
val intent = Intent(Intent.ACTION_GET_CONTENT)
getActivityContext().startActivity(intent)
}
) {
Text("BUTTON")
}
}