2016-12-28 4 views
1

Как вы можете отключить анимацию фрагментов, включая анимацию выхода, при очистке заднего стека, в настоящее время я использую следующий код, но, похоже, он не останавливает анимацию, выходящую из экрана, скорее, это останавливает анимацию нового фрагмента, входящего в экран.Отключить анимацию фрагмента фрагмента - Android

код, который я использую следующим образом:

Меню Фрагмент - код, используемый для очистки обратно стеку

private void clearBackStack() { 
     FragmentUtils.sDisableFragmentAnimations = true; 
     getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     FragmentUtils.sDisableFragmentAnimations = false; 
    } 

Фрагмент Utils Класс:

public class FragmentUtils { 
    public static boolean sDisableFragmentAnimations = false; 
} 

Все фрагменты имеют следующее:

@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { 
    if (FragmentUtils.sDisableFragmentAnimations) { 
     Animation a = new Animation() {}; 
     a.setDuration(0); 
     return a; 
    } 
    return super.onCreateAnimation(transit, enter, nextAnim); 
} 

навигации код меню (где я хочу, чтобы отключить анимацию)

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.action_events: 

        replaceFragment(new MainFragment()); 

        break; 
       case R.id.action_promotions: 

        replaceFragment(new MainFragment()); 
        break; 

       case R.id.action_menu: 

        clearBackStack(); 
        replaceFragment(new MenuFragment()); 
        break; 

      } 
      return true; 
     } 
    }); 

ответ

0
public void replaceFragment(BaseFragment fragment, int resId, boolean addToBackStack) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.setCustomAnimations(0, 0); 
    transaction.replace(resId, fragment); 
    if (addToBackStack) { 
     transaction.addToBackStack(null); 
    } 
    transaction.commitAllowingStateLoss(); 
} 
+1

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

Смежные вопросы