在碎片期间处理后退键

时间:2017-03-23 20:01:32

标签: android android-fragments android-activity

实际上问题是我只是加载一个片段(让我们调用片段-A )从导航抽屉现在片段-A调用虚拟活动,虚拟活动加载片段B 比片段B调用片段C 而片段-C调用片段-D ..

整体上图:

Fragment-A(call) - > Dummy Activity(load) - > fragment-B(call) - > fragment-C(call) - > fragment-D(call)

现在我对此提出了一些问题:

  • 实际上片段D中有一个按钮,当按钮被调用时我必须回到 Fragment-A
  • 现在在片段(B,C& D)加载期间,我必须处理On Back按下.. 表示用户在片段D中而不是在后面按下,而不是片段-C加载,反之亦然但是当用户在Fragemnt-B上时调用On-back键而不是片段A加载

注意:

  • 我必须处理Both Above Back键或系统返回键

  • 我知道我必须维护片段堆栈,但我怎样才能通过案例

    enter image description here

enter image description here

编辑:

  • 实际上片段-A是活动的一部分 - (a)而剩余的片段(B,C& D)是活动的一部分 - (X)

代码:

回购链接:Code link

2 个答案:

答案 0 :(得分:0)

以上情况可以通过以下方式解决..

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            onBackPressed();
        }
        return super.onOptionsItemSelected(item);
    }


 @Override
    public void onBackPressed() {
        finish();
    }

如果片段D中的按钮被调用,请调用该函数 getActivity()onBackPresses(); 它将完成当前的活动..

答案 1 :(得分:0)

您需要在backstack中添加片段,如下所示: -

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, fragmentA);
//No need to put fragment A in backstack


ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, fragmentB);
ft.addToBackStack(null);


ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, fragmentC);
ft.addToBackStack(null);

ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, fragmentD);
ft.addToBackStack(null);
ft.commit();

现在,你所有的片段都在backstack中,所以如果你按回片段D然后会显示fragmentC,然后按下片段C中的Back,将显示片段B并按下片段B中的返回片段,片段A将会显示。

AS,你提到你在fragmentD中有一个特殊的按钮,在按下它时会把你带到片段A,所以在点击那个按钮时执行这个代码: -

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}