我在活动中有一个片段,它嵌套了全屏,它们就像嵌套屏幕一样,所以我正在处理我的容器活动,如下所示:
@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秒的间隔发送信号。这解决了我的问题。现在,水龙头会在第一时间响应比以前快得多。
答案 0 :(得分:1)
尝试调试您的应用程序。在活动中的onBackPressed()方法的第一行中执行断点。因此,您可以确定在第一次点击手机后退按钮后是否调用该方法。
如果没有,可能FragmentManager已经处理了事件,并且每次点击按钮时都会从backstack中删除片段。
也许你的docFragment.closeNestedView()方法非常慢,因此在调用docFragment.closeNestedView()之后,docFragment.isNestedViewVisible()不会立即返回View.VISIBLE。没有代码就很难说。
答案 1 :(得分:0)
由于您正在使用片段,我认为您应该查看FragmentTransaction.addToBackStack()
和popBackStack()
以获得更可靠的方法来处理后退按钮。
也许这个链接会有所帮助: https://developer.android.com/training/implementing-navigation/temporal.html#back-fragments