[英]registerForActivityResult not working when second activity orientation changes
我正在使用ActivityResultLauncher
從活動 A 調用活動 B,並在任務完成時從活動 B 設置結果。 如果方向沒有改變,這將非常有效。 問題是當我從活動 B 更改方向然后設置結果時,不會調用活動 A 的registerForActivityResult
。 有人可以讓我知道,可能是什么問題?
注意:如果我使用startActivityForResult
和onActivityResult
,我不會遇到這個問題。 我將其更改為ActivityResultLauncher
,因為startActivityForResult
已棄用。
活動示例代碼:
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。
嘗試將launcher
的registerForActivityResult
分配移動到onCreateView()
(如果你還沒有覆蓋它)。 把它放在這里,我沒有得到“正在嘗試注冊,而當前 state 已啟動”在OnCreateView()
中的RuntimeException
與onResume()
或更高版本一樣。 OnCreateView()
優於OnCreate()
的優勢似乎是launcher
變量將在主題日/夜變化以及方向變化時重新設置。
另請參閱此處的配置更改和進程死亡部分以獲取更多討論。
我知道官方 dox說在 class 中的任何其他內容之前設置它是安全的,但是主題更改破壞了.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">
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.