2017-01-18 11 views
0

Я создаю приложение с несколькими фрагментами. У меня есть четыре фрагмента фрагмент1, фрагмент2, фрагмент3, фрагмент4. Я перехожу от разных заказов, таких как f1 -> f2 -> f4 -> f3 -> f1 или любого другого заказа. Но когда я нажимаю кнопку «Назад» из каждого фрагмента, мне нужно перейти к предыдущему фрагменту. Как справиться с этим.Кнопка обратного вызова фрагмента Android

Edit 1: Я уже пытался

FragmentManager fm = ((Activity) context).getFragmentManager(); 
     for (int i = 0; i < fm.getBackStackEntryCount(); i++) { 
      fm.popBackStack(); 
     } 

Что не поможет мне решить мою проблему.

+0

Возможный дубликат [Программно вернуться к предыдущему фрагменту в стопке назад] (http://stackoverflow.com/questions/10863572/programmatically-go-back-to-the-previous-fragm ent-in-the-backstack) –

+0

Mr. @VassilisPallas Не могли бы вы объяснить, как решить мою проблему из этого вопроса – Amsheer

+0

, что показано в вашей текущей реализации? – rafsanahmad007

ответ

0

Вам просто нужно добавить addToBackStack(null) по FragmentTransaction. , когда вы звоните в следующий Fragment просто добавьте этот метод с null параметр.

Нравится это.

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(..............); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 
1

Sample код Управление осколок обратно стек

private Stack<Fragment> stack = new Stack<Fragment>(); 
public void pushFragments(Fragment fragment, boolean shouldAnimate, 
          boolean shouldAdd) { 

    drawerClose = false; 
    if (shouldAdd) 
     stack.push(fragment); 

    this.changeFragment = fragment; 
    invalidateOptionsMenu(); 
    changeFragment(fragment, shouldAnimate, false); 
} 

public void popFragments() { 
    /* 
    * Select the second last fragment in current tab's stack.. which will 
    * be shown after the fragment transaction given below 
    */ 
    Fragment fragment = stack.elementAt(stack.size() - 2); 
    ///pop current fragment from stack../
    stack.pop(); 
    /* 
    * We have the target fragment in hand.. Just show it.. Show a standard 
    * navigation animation 
    */ 
    this.changeFragment = fragment; 
    invalidateOptionsMenu(); 
    changeFragment(fragment, false, true); 
} 

private void changeFragment(Fragment fragment, boolean shouldAnimate, boolean popAnimate) { 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    if (shouldAnimate) 
     ft.setCustomAnimations(R.anim.slide_in_right, 
       R.anim.slide_out_left); 
    if (popAnimate) 
     ft.setCustomAnimations(R.anim.slide_in_left, 
       R.anim.slide_out_right); 

    ft.replace(R.id.content_frame, fragment); 
    ft.commit(); 
} 
//On BackPress just check this thing 
    private void backManage() { 
    if (stack.size() > 1) { 
     popFragments(); 
    } 
} 
+0

Ваш ответ работает на меня. Только одна проблема заключается в том, что if (shouldAdd) .. если фрагмент уже существует, тогда нет необходимости добавлять фрагменты ... Как с этим справиться .. – Amsheer

+0

Получив тег фрагмента. Вы можете повторно использовать предыдущий фрагмент из стека. Для этого вам нужно передать «TAG» при добавлении или замене фрагмента. –

0

на активность

@Override 
public void onBackPressed() { 
    if(check_if_backstack_is_null) 
     super.onBackPressed(); 
    else 
    { 
     popupFromBackstack(); 
    } 
} 
1

Использование addToBackStack(String tag), а совершая fragment, чтобы добавить фрагмент в стек приложения:

getFragmentManager().beginTransaction().replace(fragmentContainer.getID(), fragment) 
.addToBackStack(null).commit();` 
0

Вы должны переопределить onBackPressed метод:

@Override 
public void onBackPressed() { 
    if (fragment != null && fragment.getChildFragmentManager().getBackStackEntryCount() > 0){ 
    fragment.getChildFragmentManager().popBackStack(); 
    }else { 
    super.onBackPressed(); 
    } 
} 
0

Для этого вы можете установить addToBackStack фрагментировать транзакцию и затем вызвать фиксацию. При вызове addToBackStack() транзакция замены сохраняется в фоновом стеке, чтобы пользователь мог отменить транзакцию и вернуть предыдущий фрагмент, нажав кнопку «Назад».

Если вы добавили несколько изменений в транзакцию (например, другие add() или remove()) и вызвали addToBackStack(), то все изменения, применяемые до вызова commit(), добавляются в задний стек как одна транзакция и кнопка «Назад» перевернет их все вместе.

0

Используйте эти строки кода для него: -

@Override 
    public void onBackPressed() { 
     if (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     fm.popBackStack(); 
     }else { 
     super.onBackPressed(); 
     } 
    } 

Чтобы получить функциональность backStack в вашем fragment, чем вы должны использовать .addToBackStack(null), при выполнении транзакции фрагмента, как показано ниже: -

  getSupportFragmentManager() 
         .beginTransaction() 
         .replace(R.id.YOUR_CONTAINER, YOUR_FRAGMENT,"TAG") 
         .addToBackStack(null) /// IT IS NECESSARY TO GET THE BACK STACK PROPERTY IN YOUR FRAGMENT 
         .commitAllowingStateLoss(); 
Смежные вопросы