Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Fragmento customAnimation no funciona en Lollipop

Tengo debajo del código para fijar las animaciones de entrada y salida para fragmentos.

final FragmentManager manager = getSupportFragmentManager(); final FragmentTransaction ft = manager.beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right); ft.replace(R.id.container, fragment, tag); ft.addToBackStack(tag); ft.commitAllowingStateLoss(); 

Slide_in_left.xml

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%" android:toXDelta="0%" android:duration="@integer/slide_anim_duration" /> </set> 

Utilizó el mismo método para todas las demás animaciones. Funciona bien en todas las otras versiones, pero el problema está en Lollipop solamente. Mientras miramos hacia la función
setCustomAnimations (int enter, int exit, int popEnter, int popExit) doc-link ,
enter y exit funciona bien, pero popEnter y popExit falla en Lollipop.
Por favor, guíame sobre lo que salió mal y proporcionar una solución compatible que funciona desde Android 2.3 a 5.1

Actualizar:

Observando de cerca, parece que la animación está ahí, pero la duración no tiene ningún efecto.

  • Cordova webview dentro de Android Fragment on Cordova 4.0
  • La mejor manera de cambiar entre dos fragmentos
  • FragmentActivity Pantalla de pestañas
  • Señal fatal 11 (SIGSEGV) en 0x00000000 (código = 1), hilo 27830 (ple.myfragexample) - sólo en Android 4.1.2
  • NullPointerException en FragmentManager
  • 2 ViewPager no se desplaza en Android 2.3
  • Cómo configurar el título de DialogFragment?
  • DialogFragment: Utilizar AlertDialog con diseño personalizado
  • 5 Solutions collect form web for “Fragmento customAnimation no funciona en Lollipop”

    Las animaciones de fragmentos están rotas incluso antes de L – hay algunos problemas al cambiar la orientación de la pantalla.

    A continuación, la solución soluciona los problemas L y los problemas de cambio de orientación anteriores. Utilícelo como su clase base del fragmento.

     public abstract class AnimatedSupportFragment extends DaggerFragment { private static final String STATE_ENTER_ANIM = "STATE_ENTER_ANIM"; private static final String STATE_EXIT_ANIM = "STATE_EXIT_ANIM"; private static final String STATE_POP_ENTER_ANIM = "STATE_POP_ENTER_ANIM"; private static final String STATE_POP_EXIT_ANIM = "STATE_POP_EXIT_ANIM"; private static final String STATE_CHANGING_CONFIGURATIONS = "STATE_CHANGING_CONFIGURATIONS"; private @AnimRes int mEnter = 0; private @AnimRes int mExit = 0; private @AnimRes int mPopEnter = 0; private @AnimRes int mPopExit = 0; private boolean mIsChangingConfigurations = false; public void setCustomAnimations(@AnimRes int enterAnim, @AnimRes int exitAnim, @AnimRes int popEnterAnim, @AnimRes int popExitAnim) { mEnter = enterAnim; mExit = exitAnim; mPopEnter = popEnterAnim; mPopExit = popExitAnim; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mEnter = savedInstanceState.getInt(STATE_ENTER_ANIM); mExit = savedInstanceState.getInt(STATE_EXIT_ANIM); mPopEnter = savedInstanceState.getInt(STATE_POP_ENTER_ANIM); mPopExit = savedInstanceState.getInt(STATE_POP_EXIT_ANIM); mIsChangingConfigurations = savedInstanceState.getBoolean(STATE_CHANGING_CONFIGURATIONS); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(STATE_ENTER_ANIM, mEnter); outState.putInt(STATE_EXIT_ANIM, mExit); outState.putInt(STATE_POP_ENTER_ANIM, mPopEnter); outState.putInt(STATE_POP_EXIT_ANIM, mPopExit); outState.putBoolean(STATE_CHANGING_CONFIGURATIONS, mIsChangingConfigurations); } @Override public void onResume() { super.onResume(); mIsChangingConfigurations = false; } @Override public void onPause() { super.onPause(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { mIsChangingConfigurations = getActivity().isChangingConfigurations(); } } @SuppressLint("NewApi") @Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { // This implementation fixes loosing transition animations on orientation changes: // @see http://stackoverflow.com/questions/8837408/fragment-lost-transition-animation-after-configuration-change // @see https://code.google.com/p/android/issues/detail?id=25994&can=4&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { // Do not support animations PRE-3.0, isChangingConfigurations() is not available! return null; } try { int anim; if (mIsChangingConfigurations) { // Recreating after change configuration, we don't want to play animation anim = 0; } else if (nextAnim != 0) { // Animation available (not lost) -> play it! anim = nextAnim; } else { // Animation probably lost - load anim saved in fragment state. // enter = we're about to play popEnterAnim, in other case popExitAnimation anim = enter ? mPopEnter : mPopExit; } if (anim != 0) { return AnimationUtils.loadAnimation(getActivity(), anim); } } catch (Exception ignore) {} return null; } } 

    Usted también puede probar onCreateAnimator en todos los fragmentos .. o el fragmento de base que están extendiendo …

     @target_api 20 or higher @Override public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) { if (enter) { return AnimatorInflater.loadAnimator(getActivity(), R.animator.slide_in_top); } else { return AnimatorInflater.loadAnimator(getActivity(), R.animator.fade_out); } } 

    Nota ambos arriba animadores están predefinidos y R hay android.R

    Espero que esto ayude aplausos!

    Si pones la duración a 2000 verás la animación, pero creo que es demasiado lento. Este es mi código:

     <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="-100%p" android:toXDelta="0" android:interpolator="@android:anim/decelerate_interpolator" android:duration="2000" /> 

    Puedes poner menos duración, pero verás menos animación.

    Encontré otra solución, no hace exactamente la misma animación, pero es muy similar, me gusta más esta animación que la diapositiva tradicional, este es mi código para hacer la animación:

      private Fragment fragment=new Fragment(); private FragmentManager fragmentManager=getSupportFragmentManager(); private void replaceFragmentWithAnimation(){ FragmentTransaction ft = fragmentManager.beginTransaction(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && fragment != null) { Slide slideLeft = new Slide(Gravity.RIGHT); slideLeft.setDuration(300); fragment.setExitTransition(slideLeft); } fragment = CalendarFragment.newInstance(selectedDays, plusMonths); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Slide slideRight = new Slide(Gravity.RIGHT); slideRight.setDuration(350); fragment.setEnterTransition(slideRight); } else { ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right); } ft.replace(calendarDaysContFL.getId(), fragment); ft.commit(); } 

    Aquí está la solución de trabajo: Versión modificada de la respuesta @jskierbi.

     import android.support.v4.app.Fragment; import android.view.animation.Animation; import android.view.animation.AnimationUtils; /** * @author : Pedramrn@gmail.com Created on: 2016-02-19 */ public class SupportBaseFragment extends Fragment { private boolean mIsChangingConfigurations = false; private static final String STATE_CHANGING_CONFIGURATIONS = "STATE_CHANGING_CONFIGURATIONS"; @Override public void onResume() { super.onResume(); mIsChangingConfigurations = false; } @Override public void onPause() { super.onPause(); mIsChangingConfigurations = getActivity().isChangingConfigurations(); } @Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { if (mIsChangingConfigurations) return null; if (enter) return AnimationUtils.loadAnimation(getContext(), nextAnim == 0 ? R.anim.enter_pop : nextAnim); else return AnimationUtils.loadAnimation(getContext(), nextAnim == 0 ? R.anim.exit_pop : nextAnim); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mIsChangingConfigurations = savedInstanceState.getBoolean(STATE_CHANGING_CONFIGURATIONS); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(STATE_CHANGING_CONFIGURATIONS, mIsChangingConfigurations); } 

    Enter.xml

     <?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="100%" android:interpolator="@android:anim/decelerate_interpolator" android:toXDelta="0"/> </set> 

    Enter_pop.xml

     <?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="-100%" android:interpolator="@android:anim/decelerate_interpolator" android:toXDelta="0"/> </set> 

    Exit.xml

     <?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0" android:interpolator="@android:anim/accelerate_interpolator" android:toXDelta="-100%"/> </set> 

    Exit_pop.xml

     <?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0" android:interpolator="@android:anim/accelerate_interpolator" android:toXDelta="100%"/> </set> 

    Uso:

     getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.enter_pop, R.anim.exit_pop) .replace(R.id.fragment_container, myFancyFragment) .addToBackStack(null) .commit(); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.