从片段C返回到片段A按下后退按钮

时间:2016-12-07 08:42:57

标签: android android-fragments fragmenttransaction fragmentmanager

我有一个片段,例如A - > B - > C.当我在片段C中时,按下后退按钮我需要获得片段A.也就是说,片段B不需要添加到backStack。这是实现片段之间转换的代码。

FragmentManager fragmentManager = this.getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

Fragment fragment = fragmentManager.findFragmentByTag(tag);
fragment.getArguments().putAll(args);

transaction.replace(idContainer, fragment, tag);
transaction.addToBackStack(null);
transaction.commit();

在片段C的开头,我不使用 transaction.addToBackStack(null);

现在我有以下问题。从片段С中我单击后退按钮并输入片段A,但是两层片段相互叠加。

Like this screenshot

3 个答案:

答案 0 :(得分:1)

从A到B的过渡

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new BFragment(), "BFragment").addToBackStack("A_TO_B").commit();

从B过渡到C

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new CFragment(), "CFragment").addToBackStack("B_TO_C").commit();

覆盖Activity的onBackPressed()方法。

@Override
public void onBackPressed();
if (getSupportFragmentManager().findFragmentByTag("CFragment") != null) {
    getSupportFragmentManager().popBackStack("A_TO_B",
    FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
       super.onBackPressed();
       }
}

答案 1 :(得分:0)

你可以在Fragment_C中使用以下代码在fragment_C上的Back back按钮上返回Fragment_A

 @Override
public void onResume() {

    super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){


                Fragment_A fragment = null;
                fragment = new Fragment_A();

                FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.container_body, fragment);
                fragmentTransaction.commit();


                return true;

            }

            return false;
        }
    });
}

答案 2 :(得分:-1)

当您致电Transaction.addToBackStack(null)时,您的Fragment已添加到了Backstack,因此当您不想将您的片段添加到Backstack时,您就不应该致电。

你应该做什么

当您使用Fragment-A替换Fragment-B时,不应该致电Transaction.addToBackStack(null),但是当您使用Fragment-B替换Fragment-C时,您应该致电{{1} }}。

执行此操作时,您的Transaction.addToBackStack(null)Fragment-A会被备份,Fragment-C则不会,现在当您按下后退按钮时,您将Fragment-B