OnBackPressed仅在第二次按

时间:2015-05-19 14:14:09

标签: android onbackpressed

我被困在这几天了。我有一项活动。我实施了

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

}

布局是一个视图寻呼机,我有一个FragmentStatePagerAdapter我扩展管理它。我有标签,我想管理他们的历史,所以我按照https://stackoverflow.com/a/17832632/3821037中的解释实现了历史逻辑。它工作正常,但出于某种原因,我点击更改选项卡并点击Android后退按钮时,我第一次点击isn注册 - 它没有调用活动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的视图上添加一个监听器,以及活动的根视图的所有父母 - 没有什么是收到它。)

谢谢。

1 个答案:

答案 0 :(得分:0)

问题在于,每次将历史记录保存到堆栈时,都要添加您要访问的页面的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());
}