Анимировать переход между fragmentами

Я пытаюсь оживить переход между fragmentами. Я получил ответ от следующих
Фрагменты и анимация Android

FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); DetailsFragment newFragment = DetailsFragment.newInstance(); ft.replace(R.id.details_fragment_container, newFragment, "detailFragment"); // Start the animated transition. ft.commit(); 

И мой R.anim.slide_in_left

      

Но когда я попробовал это, он показал

 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.BackStackRecord.run(BackStackRecord.java:578) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217) 

Есть идеи? Когда я проверил Honeycomb API, ссылка на translate там. Что я упустил?
Есть ли другой способ оживить переход между fragmentами? спасибо

    Вам необходимо использовать новую инфраструктуру android.animation (объектные аниматоры) с помощью FragmentTransaction.setCustomAnimations а также FragmentTransaction.setTransition .

    Ниже приведен пример использования setCustomAnimations из ApgDemos ‘ FragmentHideShow.java :

     ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); 

    и вот соответствующий XML-аниматор из res / animator / fade_in.xml :

      

    Обратите внимание, что вы можете объединить несколько аниматоров с помощью , как и в случае с более старой средой анимации.


    EDIT : поскольку люди спрашивают о вставке / выдвижении, я прокомментирую это здесь.

    Вставка и выдвижение

    Вы можете, конечно, оживить свойства translationX , translationY , x и y , но, как правило, слайды include анимацию содержимого на экран и вне его. Насколько я знаю, нет никаких свойств перехода, которые используют относительные значения. Однако это не мешает вам писать их самостоятельно. Помните, что анимации свойств просто требуют методов getter и setter для объектов, которые вы анимируете (в этом случае – представления), поэтому вы можете просто создать свои собственные getXFraction и setXFraction в вашем подclassе вида, например:

     public class MyFrameLayout extends FrameLayout { ... public float getXFraction() { return getX() / getWidth(); // TODO: guard divide-by-zero } public void setXFraction(float xFraction) { // TODO: cache width final int width = getWidth(); setX((width > 0) ? (xFraction * width) : -9999); } ... } 

    Теперь вы можете анимировать свойство «xFraction», например:

    res / animator / slide_in.xml :

      

    Обратите внимание, что если объект, который вы анимируете, не такой же, как его родитель, все будет выглядеть не совсем правильно, поэтому вам может потребоваться настроить реализацию вашего имущества в соответствии с вашим вариантом использования.

    Я сделал так:

    Добавьте этот метод для замены fragmentов анимацией :

     public void replaceFragmentWithAnimation(android.support.v4.app.Fragment fragment, String tag){ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left); transaction.replace(R.id.fragment_container, fragment); transaction.addToBackStack(tag); transaction.commit(); } 

    Вы должны добавить четыре анимации в папку с анимацией, которая ассоциируется с ресурсом :

    enter_from_left.xml :

         

    exit_to_right.xml :

         

    enter_from_right.xml :

         

    exit_to_left.xml :

         

    Вывод:

    введите описание изображения здесь

    Это сделано .

    Ответ Нурика был очень полезен, но я не мог заставить его работать, пока не нашел это . Короче говоря, если вы используете библиотеку совместимости (например, SupportFragmentManager вместо FragmentManager), синтаксис файлов анимации XML будет другим.

    Если вы можете позволить себе привязать себя к Lollipop и позже, это, похоже, делает трюк:

     import android.transition.Slide; import android.util.Log; import android.view.Gravity; . . . f = new MyFragment(); f.setEnterTransition(new Slide(Gravity.RIGHT)); f.setExitTransition(new Slide(Gravity.LEFT)); getFragmentManager() .beginTransaction() .replace(R.id.content, f, FRAG_TAG) // FRAG_TAG is the tag for your fragment .commit(); 

    Надеюсь это поможет.

    Вот анимация слайда в / из fragmentов:

     FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim); transaction.replace(R.id.listFragment, new YourFragment()); transaction.commit(); 

    Мы используем objectAnimator.

    Вот два xml-файла в подпапке аниматора .

    enter_anim.xml

         

    exit_anim.xml

         

    Надеюсь, это поможет кому-то.

    Реализация Android SDK для FragmentTransaction требует Animator то время как библиотека поддержки хочет Animation , не спрашивайте меня, почему, но после комментария strangeluk я просмотрел код и поддержку библиотеки android 4.0.3. Android SDK использует loadAnimator() а в библиотеке поддержки используется loadAnimation()

    Для всех, кто попадает, убедитесь, что setCustomAnimations вызывается перед вызовом для замены / добавления при создании транзакции.

    Попробуйте использовать это. Android предоставляет некоторые animation умолчанию.

     fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 

     FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); fragmentManager.addOnBackStackChangedListener(this); fragmentTransaction.replace(R.id.frame, firstFragment, "h"); fragmentTransaction.addToBackStack("h"); fragmentTransaction.commit(); 

    Вывод:

    введите описание изображения здесь

    Давайте будем гением компьютера.