簡體   English   中英

當第二個活動方向改變時 registerForActivityResult 不起作用

[英]registerForActivityResult not working when second activity orientation changes

我正在使用ActivityResultLauncher從活動 A 調用活動 B,並在任務完成時從活動 B 設置結果。 如果方向沒有改變,這將非常有效。 問題是當我從活動 B 更改方向然后設置結果時,不會調用活動 A 的registerForActivityResult 有人可以讓我知道,可能是什么問題?

注意:如果我使用startActivityForResultonActivityResult ,我不會遇到這個問題。 我將其更改為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。

嘗試將launcherregisterForActivityResult分配移動到onCreateView() (如果你還沒有覆蓋它)。 把它放在這里,我沒有得到“正在嘗試注冊,而當前 state 已啟動”在OnCreateView()中的RuntimeExceptiononResume()或更高版本一樣。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM