Android 使用onBackPressed和可见片段

Android 使用onBackPressed和可见片段,android,android-fragments,Android,Android Fragments,我有一个活动,其中有一个ViewPager,其中包含5个片段,底部布局有一个按钮,可以在ViewPager页面之间切换,但是每个片段都可以打开一个新片段,我正在替换MainActivity中的片段,如下所示: FragmentManager fragmentManager = getSupportFragmentManager(); Fragment placeDetailsFragment = new PlaceDetailsFragment(); fragmentManager.begin

我有一个活动,其中有一个ViewPager,其中包含5个片段,底部布局有一个按钮,可以在ViewPager页面之间切换,但是每个片段都可以打开一个新片段,我正在替换MainActivity中的片段,如下所示:

FragmentManager fragmentManager = getSupportFragmentManager();

Fragment placeDetailsFragment = new PlaceDetailsFragment();
fragmentManager.beginTransaction().setCustomAnimations(R.anim.right_in, R.anim.left_out, R.anim.left_in, R.anim.right_out).replace(rootViewID, placeDetailsFragment, fragmentTag.getKey()).addToBackStack(fragmentTag.getKey()).commit();
其中rootViewId是页面中根布局的id

我的想法是,我可以从viewpager中的第1页进入片段1,从第2页进入片段2。。等等

当我在片段1中按下hardware back(硬件返回)按钮返回到第1页,当我在片段2中返回到第2页时,我希望能够这样做,但默认的onBackPressed行为只是弹出添加到堆栈中的最后一个片段,无论哪一个可见,因此,如果我打开片段1,然后打开片段2,那么我将从前面提到的活动的底部视图返回到第1页,并在弹出片段1时按back,因为它是当前可见的


如何解决此问题?

保存最后一个片段:

Fragment lastFrag;
FragmentManager fragmentManager = getSupportFragmentManager();

Fragment placeDetailsFragment = new PlaceDetailsFragment();
fragmentManager.beginTransaction().setCustomAnimations(R.anim.right_in, R.anim.left_out, R.anim.left_in, R.anim.right_out).replace(rootViewID, placeDetailsFragment, fragmentTag.getKey()).addToBackStack(fragmentTag.getKey()).commit();

lastFrag = placeDetailsFragment;
@Override
public void onBackPressed() {

    FragmentManager fragmentManager = getSupportFragmentManager();

    fragmentManager.beginTransaction().setCustomAnimations(R.anim.right_in, R.anim.left_out, R.anim.left_in, R.anim.right_out)
       .replace(rootViewID, lastFrag, fragmentTag.getKey()).addToBackStack(fragmentTag.getKey()).commit();

}
Override onBackPressed可弹出保存的片段:

Fragment lastFrag;
FragmentManager fragmentManager = getSupportFragmentManager();

Fragment placeDetailsFragment = new PlaceDetailsFragment();
fragmentManager.beginTransaction().setCustomAnimations(R.anim.right_in, R.anim.left_out, R.anim.left_in, R.anim.right_out).replace(rootViewID, placeDetailsFragment, fragmentTag.getKey()).addToBackStack(fragmentTag.getKey()).commit();

lastFrag = placeDetailsFragment;
@Override
public void onBackPressed() {

    FragmentManager fragmentManager = getSupportFragmentManager();

    fragmentManager.beginTransaction().setCustomAnimations(R.anim.right_in, R.anim.left_out, R.anim.left_in, R.anim.right_out)
       .replace(rootViewID, lastFrag, fragmentTag.getKey()).addToBackStack(fragmentTag.getKey()).commit();

}

请注意lastFrag而不是placeDetailsFragment in.replace inside onBackPressed()

您可能需要基本上实现OnBackbackChangedListener,并在其中添加您自己的逻辑。@AndreiT您能提供一个示例或链接吗?您能更好地解释您的情况吗?很难理解understand@BlueMango很抱歉我的英语不好,我只是想从后堆栈中弹出可见的片段,而不是最后添加的片段。@EyadMhanna我发布了一个答案:)这是默认popBackStack行为的重新实现,即弹出最后添加的片段而不是我需要的当前可见的片段:)