ventanas tipos studio emergentes edittext diálogos dialogos dialogo crear con como android android-animation buttonclick dialogfragment

android - tipos - Cambie la transición de entrada/salida de DialogFragment justo antes de salir.



tipos de dialogos en android studio (5)

Tengo un DialogFragment y configuro la animación para entrar / salir en el método onActivityCreated como se muestra a continuación

@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 animaciones de salida diferentes, una para cuando se hace clic en el botón Aceptar y otra para el botón cancelar. Así que lo que hice fue intentar cambiar la transición antes de descartar pero no funcionó ... cualquier solución sobre cómo se puede lograr ... Esto es lo que probé.

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


Creo que el mejor enfoque es llamar a las diferentes animaciones en Button click. Por lo tanto, tendría algo similar a lo 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 denominación correctas para futuras referencias. Por ejemplo, establecer DialogAnimation en OkAnimation y DialogAnimation2 en CancelAnimation.

Inicio esto ayuda :)


Debes establecer un tema para tu diálogo 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 solo necesita definir el tema que incluirá su animación deseada. En styles.xml agrega tu 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>

refiera this


Puede configurar una animación hacia arriba para el fragmento de diálogo.

// deslice hacia arriba la animación

<?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>

// diapositiva dowm animación

<?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; }


Puede hacerlo dentro de su DialogFragment, sin cambiar

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

Debería animar la "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(); }

Luego anula 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.

Y si elimina las propiedades de escala de mi código, obtendrá solo animación alfa. Exactamente como quisieras.

Elimina esto:

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


Una forma simple de hacer lo que quieras 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 } });

Comience la animación en su método onclick y cierre el diálogo en el métodoAnimationEnd (). Puede que tenga que hacer objetos de borrado e iniciarlos manualmente con el método startAnimation (animación) de View.