1

У меня есть фрагменты, например A -> B -> C. Когда я нахожусь в фрагменте C и нажимаю кнопку «Назад», мне нужно попасть на фрагмент A . То есть фрагмент B не требуется добавлять в backStack. Вот код, который реализует переход между фрагментами.Возврат из фрагмента C в фрагмент Нажатие кнопки возврата

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);

И теперь у меня есть следующая проблема. Из фрагмента С нажимаем кнопку «Назад» и вводим фрагмент А, но два слоя фрагментов накладываются друг на друга.

Like this screenshot

+0

Добавить все фрагменты в backstack, а затем повторить цикл до первого фрагмента – Bhavnik

+0

Вы используете viewpager? –

+0

Возможно, вы хотите проверить [этот вопрос] (http://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack) –

ответ

-1

Когда вы звоните Transaction.addToBackStack(null), ваш Fragment добавлен в backstack, так что вы не должны звонить, когда вы не хотите, чтобы добавить фрагмент в backstack.

Что вы должны сделать

При замене Fragment-A с Fragment-B вы не должны вызывать Transaction.addToBackStack(null), но при замене Fragment-B с Fragment-C вы должны вызвать Transaction.addToBackStack(null).

Делая это ваш Fragment-A и Fragment-C будет backstacked но Fragment-B не будет, теперь, когда вы нажимаете кнопку назад, вы будете иметь Fragment-A.

0

Вы можете использовать следующий код в Fragment_C Чтобы вернуться к Fragment_A на пресс кнопку Назад от fragment_C

@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; 
     } 
    }); 
} 
0

Переход от А к В

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(); 

Переопределить метод onBackPressed().

@Override 
public void onBackPressed(); 
if (getSupportFragmentManager().findFragmentByTag("CFragment") != null) { 
    getSupportFragmentManager().popBackStack("A_TO_B", 
    FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} else { 
     super.onBackPressed(); 
     } 
} 
Смежные вопросы