Androidx OnBackPressedDispatcher语言 - 如何使用后退按钮按下



我希望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()那么调度程序甚至不起作用。 它需要那个调用。

这是因为OnBackPressedDispatcherComponentActivity.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,就会启用该回调。我不确定是否有快速的解决方法。

相关内容

  • 没有找到相关文章

最新更新