手机后退按钮按下只有在点击 3-5 次后才有反应?

Phones back button press responds only after 3-5 times tap?

我在 activity 中有一个片段,它嵌套了全屏,它们像嵌套屏幕一样制作,所以我在我的容器 activity 中按如下方式处理后退:

    @Override
            public void onBackPressed() {
                DrawerLayout drawer = (DrawerLayout) 
    findViewById(R.id.drawer_layout); // first line where I have debug point
                if (drawer.isDrawerOpen(GravityCompat.START)) {
                    drawer.closeDrawer(GravityCompat.START);
// If drawer is open then on backpress drawer will be closed
                } else {
                    if (docFragment != null && docFragment.isAdded()) {
                        if (docFragment.isNestedViewVisible() == View.VISIBLE) {
                             docFragment.closeNestedView();
        // Above method will hide the nested view in fragment 
        // & return back to original default view of fragment
                        } else {
                            super.onBackPressed();
                        }
                    } else {
                        super.onBackPressed();
                    }
                }
            }

我添加片段所使用的代码:

docFragment = DocumentFragment.newInstance();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.container, docFragment, "Documents");
        fragmentTransaction.commit();

有时手机的后退按钮没有任何作用。我必须按它 3-5 次。我 运行 调试器中的应用程序,但调试器在点击 3-5 次后也进入第一行。

这是从 activity 处理的。

但为什么我的 onBackPress 事件在点击 3-5 次后触发,而不是在单击时触发?

更新:

用户 Maik Peschutter below has 我的片段可能有一些繁重的过程,这可能会导致 onBackPress 传送延迟或根本不传送。

我以这种观点进行了调查,似乎后台有一项服务正在发送一些信号(广播)导致我的 UI 重绘,重绘的组件很复杂并且需要时间。

来自后台服务的信号频率太高,以毫秒为单位导致重绘快速发生,这使我的应用程序冻结,现在我已安排服务以 20 秒的间隔发送信号。这解决了我的问题。现在水龙头第一次响应并且比以前快得多。

由于您使用的是片段,我认为您应该查看 FragmentTransaction.addToBackStack()popBackStack() 以获得更可靠的处理后退按钮按下的方法。

也许这个 link 会有所帮助: https://developer.android.com/training/implementing-navigation/temporal.html#back-fragments

尝试调试您的应用程序。在 activity 的 onBackPressed() 方法的第一行做一个断点。因此,您可以确定该方法是否在第一次点击手机后退按钮后被调用。

如果不是,可能 FragmentManager 已经处理了该事件并在您每次点击按钮时从后台删除一个片段。

也许您的 docFragment.closeNestedView() 方法非常慢,因此 docFragment.isNestedViewVisible() 在您调用 docFragment.closeNestedView() 后立即返回,而不是 View.VISIBLE。没有代码很难说。