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

时间:2019-09-07 21:13:44

标签: androidx onbackpressed

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(),则调度程序甚至无法工作。它需要那个电话。

1 个答案:

答案 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就会启用。我不确定是否有快速的解决方法。