注册活动结果在第二个活动方向更改时不起作用



我使用ActivityResultLauncher从活动 A 调用活动 B,并在任务完成后设置活动 B 的结果。如果不改变方向,这将完美地工作。问题是当我从活动 B 更改方向然后设置结果时,不会调用活动 A 的registerForActivityResult。有人可以让我知道,可能是什么问题?

注意:如果我使用startActivityForResultonActivityResult,我不会遇到此问题。我将其更改为ActivityResultLauncher,因为startActivityForResult被弃用。

活动 A 示例代码:

private lateinit var launcher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layout)
setLauncherResult()
}
private fun setLauncherResult() {
launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
//Do operations here
}
}
//On button click starting activity B using launcher
val intent = Intent(activityA, activityB)
launcher.launch(intent)
}

活动 B 示例代码:

//setting result
val intent = Intent()
//set intent extras
setResult(Activity.RESULT_OK, intent)
finish()

您可以将值保存在onSaveInstanceState()中,并在onRestoreInstanceState()中使用 setResult 。

尝试将launcherregisterForActivityResult分配移动到onCreateView()(如果尚未覆盖它)。 把它放在这里,我没有像onResume()或更高版本那样得到OnCreateView()的"正在尝试在当前状态启动时注册"RuntimeExceptionOnCreateView()相对于OnCreate()的优势似乎是,launcher变量将在主题日/夜变化以及方向变化时重新设置。

另请参阅此处的配置更改和进程死亡部分以获取更多讨论。

我知道官方 dox 说在课堂上设置它是安全的,但主题更改破坏了.launch(),这个位置似乎对我有用。

每次方向更改时,它都会调用onCreate并重置您的视图 &launcher等其他变量被重新分配。因此,您可以按照此处官方文档中显示的示例进行操作:https://developer.android.com/training/basics/intents/result#launch

并将您的launcher作业从onCreate中拉出,如下所示(这对我有用):

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding

private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
//do your stuff here
binding.tv.text = result.data?.getStringExtra("text")
}
}

companion object {
var number : Int = 0
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.tv.setOnClickListener {
val intent = Intent(this, ActivityB::class.java)
startForResult.launch(intent)
}
}
}

如果您不希望在方向更改时再次调用onCreate。然后在清单中添加configChanges

<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize">

相关内容

  • 没有找到相关文章

最新更新