OnBackPressed仅在第二次按下时调用

问题描述:

我一直坚持这一天。我有一个活动。我实现了OnBackPressed仅在第二次按下时调用

@Override 
public void onBackPressed() { 
    Log.e("TEST", "Pressed back"); 
    mAdapter.back(); 

} 

布局是一个视图寻呼机,我有一个FragmentStatePagerAdapter扩展管理它。我有标签,我想管理他们的历史,所以我实现了历史逻辑,如https://*.com/a/17832632/3821037中所述。它工作正常,但由于某种原因,当我点击更改选项卡,并在第一次点击时没有注册Android按钮后,它不会调用活动OnBackPressed。第二个电话工作正常。有谁知道第一个事件发生在哪里?我应该说我永远不会离开那个相同的活动。 我还可以看到第一个事件记录

05-20 12:44:17.952: I/ViewRootImpl(22749): ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=8406029, downTime=8406029, deviceId=-1, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{428bba20 V.E..... R....... 0,0-1080,1776} 

但我不知道哪个对象得到它(我也试图在片段和viewPager的视图中添加一个侦听器,也都在家长活动的根视图 - 没有任何东西正在接收它)。

谢谢。

问题是,当您每次将历史记录保存到堆栈时,都会添加将要访问的页面的int值。当你点击后退按钮时,你会看到它使用onBackPressed(),但什么都不做,因为它弹出/导航了当前所在的选项卡的历史添加。

当您从标签2转到3.标签3被添加到堆栈。

如果您在此场景中点击后退按钮,您将导航到添加到堆栈的最后一个页面,并同时将其删除。

所以你点击后退按钮,希望导航到标签在2.事情是,三是最后一个添加到堆栈,所以你导航到3,并删除它,即使你已经3。接下来onBackPressed()你导航到2并像预期的那样删除它。

而不是使用:

if (!pageHistory.empty()) { 
    viewPager.setCurrentItem(pageHistory.pop().intValue()); 
} 

尝试:

if (pageHistory.size()>1){ 
    pageHistory.pop().intValue(); 
    viewPager.setCurrentItem(pageHistory.peek()); 
}