im希望onBackPressedDispatcher有时吸收后退按钮的按下,但我看不到它的选项。发生的事情是,我们今天只是在尝试升级到androidX中的onBackPressedDispatcher,但我们已经在活动中覆盖了onBackPress。因此,当我们的onBackPressedDispatcher之后调用OnBackPressedCallback时,也会有一个对活动onBackPressed覆盖的调用。我们不想要那个。 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(),则调度程序甚至无法工作。它需要那个电话。
答案 0 :(得分:1)
这是因为,如果您查看源代码,则会在cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=True ..
中调用OnBackPressedDispatcher
:
ComponentActivity.onBackPressed()
因此,如果您覆盖 @Override
@MainThread
public void onBackPressed() {
mOnBackPressedDispatcher.onBackPressed();
}
并且永远不会调用super方法,那么您将永远不会到达回调。我认为onBackPressed
背后的全部想法是,如果您想让您的片段拦截回压,则不必覆盖OnBackPressedDispatcher
。提到了in one of the guides。
如果您真的希望自己的活动能够处理后按,可以尝试在覆盖中尝试以下操作:
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
}
将返回true,即使您自己没有添加任何回调也是如此。这是因为您的hasEnabledCallbacks
拥有自己的后按回调,只要FragmentManager
就会启用。我不确定是否有快速的解决方法。