3

我已经坚持了好几天了。我有一个活动。我实施了

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

}

布局是一个视图寻呼机,我扩展了一个 FragmentStatePagerAdapter 来管理它。我有标签,我想管理它们的历史,所以我实现了历史逻辑,如https://stackoverflow.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 的视图上添加一个侦听器,以及活动的根视图的所有父级 - 没有任何东西接收它)。

谢谢你。

4

1 回答 1

0

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

当您从选项卡 2 转到 3 时。选项卡 3 被添加到堆栈中。

如果在这种情况下单击后退按钮,您将导航到添加到堆栈的最后一页并同时将其删除。

所以你点击返回按钮,期望导航到 2 处的选项卡。问题是,3 是添加到堆栈中的最后一个,所以你导航到 3 并删除它,即使你已经在 3 上。下一个 onBackPressed()您导航到 2 并按预期删除它。

而不是使用:

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

尝试:

if (pageHistory.size()>1){
    pageHistory.pop().intValue();
    viewPager.setCurrentItem(pageHistory.peek());
}
于 2016-02-14T18:27:07.020 回答