我希望onBackPressedDispatcher
吸收后退按钮按下事件。有时,但我看不到它的选择。发生的事情是,我们今天刚刚尝试在 androidX 中升级到onBackPressedDispatcher
,但我们已经覆盖了活动中的onBackPressd
。因此,当我们的onBackPressedDispatcher
调用OnBackPressedCallback
之后,也会调用BackPress覆盖的活动。我们不希望这样。onBackpressed
应当场食用。这是我到目前为止所拥有的:
const val TAG = "MyTag"
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_first)
MyTester(this)
}
override fun onBackPressed() {
super.onBackPressed()
Log.v(TAG, "Activities class back button Pressed")
}
inner class MyTester(var activity: AppCompatActivity) {
init {
addBackCB()
}
fun addBackCB() {
var callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
Log.v(TAG, "inner class MyTester back button")
}
}
activity.onBackPressedDispatcher.addCallback(activity, callback);
}
}
}
其中打印以下内容:
V/MyTag: inner class MyTester back button
V/MyTag: Activities class back button Pressed
如果我不打电话给super.onBackPressed()
那么调度程序甚至不起作用。 它需要那个调用。
这是因为OnBackPressedDispatcher
在ComponentActivity.onBackPressed()
中被调用,如果你看一下源代码:
@Override
@MainThread
public void onBackPressed() {
mOnBackPressedDispatcher.onBackPressed();
}
因此,如果您重写onBackPressed
并且从不调用 super 方法,您将永远不会到达回调。我认为OnBackPressedDispatcher
背后的整个想法是,如果你想让你的片段拦截回压,你不应该覆盖Activity.onBackPressed
。其中一份指南中提到了这一点。
如果您真的希望您的活动处理后压,您可以在覆盖中尝试以下操作:
if (onBackPressedDispatcher.hasEnabledCallbacks()) {
// There's an active callback; let the fragment handle it
super.onBackPressed()
} else {
// Do your activity's back press handling here
}
不过,这样做要小心。自己尝试后,您可能会发现即使您自己没有添加任何回调,hasEnabledCallbacks
也会返回 true。这是因为您的FragmentManager
有自己的反向回调,只要backStackEntryCount > 0
,就会启用该回调。我不确定是否有快速的解决方法。