提问人:Bitwise DEVS 提问时间:6/27/2022 最后编辑:NeohBitwise DEVS 更新时间:9/27/2022 访问量:13105
onBackPressedDispatcher.onBackPressed() 与 backPressedCallback.handleOnBackPressed()
onBackPressedDispatcher.onBackPressed() vs backPressedCallback.handleOnBackPressed()
问:
由于旧的从 Android 33 开始被弃用,那么以编程方式调用它更好的方法是什么?Activity.onBackPressed()
例:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
// Handle default back arrow click
android.R.id.home -> {
onBackPressed()
}
...
我们可以创建并添加这样的内容。OnBackPressedCallback
onBackPressedDispatcher
onBackPressedDispatcher.addCallback(
this, // Lifecycle owner
backPressedCallback
)
private val backPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (viewPager.currentItem != 0)
viewPager.setCurrentItem(0, true)
else
finish()
}
}
然后将旧的替换为onBackPressed
// Handle default back arrow click
android.R.id.home -> {
backPressedCallback.handleOnBackPressed()
}
但是我看到了这种公共方法,并想知道我是否可以使用它来代替。onBackPressedDispatcher
onBackPressedDispatcher.onBackPressed()
此方法是否对 中添加的每个方法进行迭代?OnBackPressedCallback
onBackPressedDispatcher
答:
所以基本上是一样的,如果你不关心精确的导航,你可以以同样的方式使用它。我怎么知道?- 好吧,你可以看到 的源代码(基本上是你正在使用的常规 Activity 的父级),它看起来像这样:onBackPressedDispatcher.onBackPressed()
Activity.onBackPressed()
ComponentActivity
onBackPressed()
@Override
@MainThread
public void onBackPressed() {
mOnBackPressedDispatcher.onBackPressed();
}
关于它调用回调队列 - 你也是对的,但它不是在迭代它 - 而只是调用最近的一个 - 一次一个(每次反按或每次调用触发器),文档指出:onBackPressed()
public void onBackPressed()
以与添加回调相反的顺序触发对当前添加的回调的调用。仅当最近添加的回调不是时,才会调用任何以前添加的回调。
enabled
如果调用此方法时 hasEnabledCallbacks 为 false,则将触发
构造函数设置的
回退 Runnable。
所以你在这里的策略可能是这样的 - 如果你需要在后退导航之前执行一些特定的东西 - 你把它添加到回调中。如果不需要特殊行为 - 你可以直接调用 - 它仍然会调用最近添加的(当然如果有的话)回调方法,但如果它是空的 - 后面就可以正常工作了。handleOnBackPressed
mOnBackPressedDispatcher.onBackPressed()
但是,您需要记住,方法有两个覆盖:addCallback
addCallback(@NonNull OnBackPressedCallback onBackPressedCallback)
和
public void addCallback(
@NonNull LifecycleOwner owner,
@NonNull OnBackPressedCallback onBackPressedCallback
)
在前者中 - 您必须自己处理回调队列,当您不再需要执行回调时调用回调。在后者中,状态更改必须为您处理所有需要的东西。remove
LifecycleOwner
评论
mOnBackPressedDispatcher
评论
OnBackInvokedCallback
onBackInvokedDispatcher
onBackPressed()
onBackPressedDispatcher
/OnBackPressedCallback
addCallback
OnBackPressedCallback(false)
.isEnabled