Cambiar DialogFragment entrar / salir de la transición justo antes de despedir

Tengo un DialogFragment y fijo la animación para entrar / salida en el método onActivityCreated como abajo

@Override public void onActivityCreated(Bundle arg0) { super.onActivityCreated(arg0); getDialog().getWindow() .getAttributes().windowAnimations = R.style.DialogAnimation; } 

Mis archivos de estilo DialogAnimation son los siguientes

 <style name="DialogAnimation"> <item name="android:windowEnterAnimation">@android:anim/fade_in</item> <item name="android:windowExitAnimation">@android:anim/fade_out</item> </style> 

Esto funciona para mí ahora …

Ahora mi problema es que quiero tener dos diferentes salida animación uno para cuando se pulsa el botón ok y uno para el botón de cancelación. Así que lo que hice fue que traté de cambiar la transición antes de despedir, pero no funcionó .. cualquier solución En cómo se puede lograr … Esto es lo que he intentado.

  @Override public void onClick(View v) { getDialog().getWindow() .getAttributes().windowAnimations = R.style.DialogAnimation2; this.dismiss(); } 

5 Solutions collect form web for “Cambiar DialogFragment entrar / salir de la transición justo antes de despedir”

Puedes hacerlo dentro de tu DialogFragment, sin cambiar

 getDialog().getWindow() .getAttributes().windowAnimations 

Debe animar "vista de decoración" en onStart y onClick.

Este es el código cortado:

Crear diálogo primero

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle("Hello from animated dialog :)") .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //we have to add button here and then override it's click in onStart } } ) .setCancelable(false) .create(); } 

A continuación, anule el método onStart

 @Override public void onStart() { super.onStart(); AlertDialog dialog = (AlertDialog)getDialog(); final View decorView = getDialog() .getWindow() .getDecorView(); ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView, PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f), PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f), PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f)); scaleDown.setDuration(2000); scaleDown.start(); Button positiveButton = dialog.getButton(Dialog.BUTTON_NEGATIVE); positiveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final View decorView = getDialog() .getWindow() .getDecorView(); ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView, PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f)); scaleDown.addListener(new Animator.AnimatorListener() { @Override public void onAnimationEnd(Animator animation) { dismiss(); } @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); scaleDown.setDuration(2000); scaleDown.start(); } }); } 

Aquí está la animación de resultados

Demostración del resultado


Y si usted quita propiedades de la escala de mi código usted conseguirá solamente animación del alfa. Exactamente como querías.

Elimina esto:

 PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f), 

Puede configurar un fragmento de animación Arriba hacia abajo para el diálogo.

// Deslice la animación hacia arriba

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

// Desplazamiento de animación de dowm

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

// Estilo

 <style name="DialogAnimation"> <item name="android:windowEnterAnimation">@anim/slide_up</item> <item name="android:windowExitAnimation">@anim/slide_down</item> </style> 

// Fragmento de diálogo interno

 @Override public void onActivityCreated(Bundle arg0) { super.onActivityCreated(arg0); getDialog().getWindow() .getAttributes().windowAnimations = R.style.DialogAnimation; } 

Una forma sencilla de hacer lo que quieres es usar oyentes de animación como.

  animation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub // dismiss your dialog in here and it will work } }); 

Inicie la animación en su método onclick y descarte el diálogo en el método onAnimationEnd (). Es posible que tenga que crear objetos snimation e iniciarlos manualmente con el método startAnimation (animación) de View.

Creo que el mejor enfoque es llamar a las diferentes animaciones en el botón de clic. Por lo tanto, usted tendría algo similar a la siguiente:

  protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button OkButton = (Button) findViewById(R.id.btnOk); Button CancelButton = (Button) findViewById(R.id.btnCancel); OkButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; } }); return true; CancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation2; } }); return true; } 

Si yo fuera usted, también usaría las convenciones de nomenclatura correctas para referencia futura. Por ejemplo, establecer DialogAnimation a OkAnimation y DialogAnimation2 a CancelAnimation.

Esto ayuda a casa 🙂

Debe establecer un tema para el diálogo de base

Digamos :-

 public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Set a theme on the dialog builder constructor! AlertDialog.Builder builder = new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme ); builder .setTitle( "Your title" ) .setMessage( "Your message" ) .setPositiveButton( "OK" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dismiss(); } }); return builder.create(); } } 

Entonces sólo tiene que definir el tema que incluirá su animación deseada. En styles.xml añada su tema personalizado:

 <style name="MyCustomTheme" parent="@android:style/Theme.Panel"> <item name="android:windowAnimationStyle">@style/MyAnimation.Window</item> </style> <style name="MyAnimation.Window" parent="@android:style/Animation.Activity"> <item name="android:windowEnterAnimation">@anim/anim_in</item> <item name="android:windowExitAnimation">@anim/anim_out</item> </style> 

Remitir esto

  • Detectar el botón Atrás pero no descartar el diálogo
  • Appcompact DialogFragment de una sola opción marca de verificación color
  • Retener el oyente tras la rotación de la pantalla - DialogFragment con DatePicker
  • Java.lang.IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState con DialogFragment
  • Android - DialogFragment con diseño que contiene fragmento
  • Cómo ocultar el teclado en pantalla cuando un DialogFragment es cancelado por el evento setCanceledOnTouchOutside
  • Método onDateChanged no parece funcionar
  • Android: NullPointerException en DialogFragment.dismissInternal en DialogFragment.dismissAllow
  • Las reglas de alineación RelativeLayout no funcionan en DialogFragment
  • Tema de DatePickerDialog de Android 6.0
  • Inicio de DialogFragment desde una clase que se extiende RecyclerView.ViewHolder
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.