我在活动中有一个片段,它有嵌套的全屏,它们就像嵌套的屏幕,所以我在容器活动中处理回压,如下所示:
@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次点击之后也会进入第一行。
这是从活动中处理的。
但是为什么我的onBackPress事件在3到5次点击后就会被解雇,而不是一次点击?
更新:
下面的用户Maik Peschutter有suggested,我的片段可能有一些很重的过程,这可能会导致onBackPress交付延迟或根本不发生。
我在这种感性的研究中发现,背景中似乎有一个服务在发送一些信号(广播),导致我的UI被重绘,而被重绘的组件很复杂,需要时间。
来自后台服务的信号的频率太高了,在毫秒内,它导致了重绘的迅速发生,这使得我的应用程序freez,现在我的预定服务是以20秒的间隔发送信号。这解决了我的问题。现在,点击第一次响应&比之前要快得多。
发布于 2017-08-24 13:54:35
尝试调试应用程序。在活动中,在onBackPressed()方法的第一行中执行一个断点。因此,您可以确定该方法是否在您的手机返回按钮上的第一个点击之后被调用。
如果不是,可能FragmentManager已经处理了事件,并且每次点击按钮时都会从后台删除一个片段。
也许您的docFragment.closeNestedView()方法非常慢,因此在调用docFragment.closeNestedView()之后,docFragment.isNestedViewVisible()将返回而不是View.VISIBLE。没有密码很难说。
发布于 2017-08-24 13:16:52
由于您使用的是片段,我认为您应该看看FragmentTransaction.addToBackStack()和popBackStack(),以找到一种更可靠的方法来处理按下的后退按钮。
也许这个链接会有所帮助:https://developer.android.com/training/implementing-navigation/temporal.html#back-fragments
https://stackoverflow.com/questions/45862486
复制相似问题