有时候,我想自己处理用户按下的后退按钮,我的代码(示例)如下:
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.test)
}
override fun onBackPressed() {
if (checkSomeCondition()) {
// do nothing
} else {
super.onBackPressed()
}
}
private fun checkSomeCondition() = false
}
当按下back时,我得到通知,然后我决定是否要处理它,或者通过调用super.onBackPressed()
让系统处理它。
由于onBackPressed()现在已被弃用,因此我使用OnBackPressedDispatcher
替换它:
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.test)
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (checkSomeCondition()) {
// do nothing
} else {
onBackPressedDispatcher.onBackPressed()
}
}
})
}
private fun checkSomeCondition() = false
}
此代码的问题:通过调用onBackPressedDispatcher.onBackPressed()
,我调用了我自己的回调函数,创建了一个无限循环,而不是像使用super.onBackPressed()
那样将其交给系统。
这可以通过临时禁用回调来避免,例如:
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (checkSomeCondition()) {
// do nothing
} else {
this.isEnabled = false
onBackPressedDispatcher.onBackPressed()
this.isEnabled = true
}
}
})
但这似乎相当尴尬,而且似乎不像是故意的。
这里OnBackPressedDispatcher
的正确用法是什么?它可以让我自己处理后退按钮或将其交给系统?
PS:我已经看到了this关于onBackPressed的弃用的问题,但它没有回答我更具体的问题。
1条答案
按热度按时间bq3bfh9z1#
按照Basics of System Back video,Predictive Back gesture的全部意义在于提前知道要处理什么。
这意味着,您应该永远不要将
checkSomeCondition
这样的即时逻辑作为对handleOnBackPressed
的调用的一部分。相反,正如Custom back navigation documentation中所解释的,只要用于签入
checkSomeCondition
的条件发生变化,就应该提前更新OnBackPressedCallback
的isEnabled
状态,这样可以确保回调仅在条件为真时调用,在条件为假时禁用,从而允许默认行为发生。