gpt4 book ai didi

android - 如何正确使用 registerForActivityResult?获取 "LifecycleOwners must call register before they are STARTED"

转载 作者:行者123 更新时间:2023-12-04 23:54:52 48 4
gpt4 key购买 nike

我用 registerForActivityResult就像 :

package com.example.livedata

import android.Manifest
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.ActivityNotFoundException
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.View
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.example.livedata.databinding.ActivityAddBinding
import com.example.livedata.databinding.DialogCustomImageSelectionBinding


class AddActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var binding: ActivityAddBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityAddBinding.inflate(layoutInflater)
setContentView(binding.root)
setupActionBar()

binding.photoAdd.setOnClickListener(this)
}

private fun setupActionBar() {
setSupportActionBar(binding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
binding.toolbar.setNavigationOnClickListener { onBackPressed() }
}

override fun onClick(v: View?) {
if (v != null) {
when (v.id) {
R.id.photo_add -> {
imageDialog()
return
}
}
}
}

private fun imageDialog() {
val dialog = Dialog(this)
val dialogBinding: DialogCustomImageSelectionBinding =
DialogCustomImageSelectionBinding.inflate(layoutInflater)
dialog.setContentView(dialogBinding.root)
dialog.show()

dialogBinding.impCamera.setOnClickListener {
registerForActivityResult(ActivityResultContracts.TakePicturePreview()) {
if (it != null) {
Toast.makeText(this@AddActivity, "TakePicturePreview", Toast.LENGTH_SHORT).show()
}
}.launch(null).apply { arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA) }
dialog.dismiss()
}

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
data?.let {
val bp = data.getParcelableExtra<Bitmap>("data")
binding.imageView.setImageBitmap(bp)

}
}
}

private fun showPermissions() {
AlertDialog.Builder(this).setMessage("Applay Permissions!")
.setPositiveButton("Go to Settings") { _, _ ->
try {
val intel = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package", packageName, null)
intel.data = uri
startActivity(intel)
} catch (e: ActivityNotFoundException) {
e.printStackTrace()
}
}.setNegativeButton("Cancel") { dialog, _ ->
dialog.dismiss()
}.show()
}
}
但它不起作用并在这里抛出异常:
2021-07-16 15:38:50.472 29885-29885/com.example.livedata E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.livedata, PID: 29885
java.lang.IllegalStateException: LifecycleOwner com.example.livedata.AddActivity@9fc53b9 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:659)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:668)
at com.example.livedata.AddActivity.imageDialog$lambda-3(AddActivity.kt:68)
at com.example.livedata.AddActivity.lambda$N7K_EbTML-ycmUwpA7-i8b_L-Sw(Unknown Source:0)
at com.example.livedata.-$$Lambda$AddActivity$N7K_EbTML-ycmUwpA7-i8b_L-Sw.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:7281)
at android.view.View.performClickInternal(View.java:7255)
at android.view.View.access$3600(View.java:828)
at android.view.View$PerformClick.run(View.java:27925)
at android.os.Handler.handleCallback(Handler.java:900)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8393)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
2021-07-16 15:38:50.539 1689-2062/? E/InputDispatcher: channel 'ba7a009 com.example.livedata/com.example.livedata.AddActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
如何使用 registerForActivityResult 而不是弃用的方法来完成此任务?非常感谢所有帮助。

最佳答案

您正在尝试调用 registerForActivityResult在点击监听器中。那是行不通的,因为你的 Activity在交付结果之前可能会被销毁并重新创建。重新创建的Activity不会被注册接收结果,因为只有点击按钮才会注册,而原Activity中只有点击按钮.
要解决此问题,您需要调用 registerForActivityResult无条件地将结果存储在变量中:

class MyActivity : AppCompatActivity() {
private val activityLauncher = registerForActivityResult(...
这样,重新创建的 Activity将被注册以接收结果。然后使用 activityLauncher变量以从按钮单击监听器启动它。
如需更多信息,请参阅 official guide .

关于android - 如何正确使用 registerForActivityResult?获取 "LifecycleOwners must call register before they are STARTED",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68405703/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com