DialogFragment animación de diseño y "Intentar destruir la ventana mientras dibuja!" Error

Tengo un DialogFragment que tiene algunas animaciones de algunas de las disposiciones dentro de su vista. Cuando descarto el diálogo, quiero realizar una animación y cuando la animación ha terminado, realizar la operación de descarte.

Paso 1: Llame al fragmento de mi actividad:

myDialog.show(getSupportFragmentManager(), ""); 

Paso 2: Después de que el usuario haya completado el trabajo con el diálogo, presiona un botón. Ese botón llama a una animación y después de eso quiero que el diálogo desaparezca:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.my_layout, null); layMain = (LinearLayout) layout.findViewById(R.id.layMain); TextView btnCancel = (TextView) layout.findViewById(R.id.btnCancel); btnCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { final Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.translate_to_bottom); anim.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { dismiss(); } }); layMain.startAnimation(anim); } }); ..... 

Cuando las animaciones terminan, el diálogo se descarta pero consigo este error en logcat

E / ViewRootImpl (25507): ¡El intentar destruir la ventana mientras que dibuja! E / ViewRootImpl (25507): window=android.view.ViewRootImpl@427348e0, title = com.mypackage / com.mypackage.MyActivity

¿Cómo puedo evitar esto?

Edición posterior: si lo estoy utilizando sin ninguna animación, todo funciona bien y no se muestra ningún error en logcat. Así que supongo que tiene que hacer algo con la animación.

La animación que estoy usando:

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

La única solución que funciona hasta ahora, sin lanzar un error es la siguiente:

 @Override public void onAnimationEnd(Animation animation) { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { dismiss(); } }, 10); 

}

Estoy abierto a cualquier otra sugerencia

Tienes un contexto de fragmento de paso como getSupportFragmentManager (). Así que tienes que cambiarlo:

 myDialog.show(getFragmentManager(), ""); 

No veo ninguna de estas cuestiones:

 public class MyDIalog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Button b = new Button(getActivity()); final Dialog d = super.onCreateDialog(savedInstanceState); d.setContentView(b); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { b.animate().rotationYBy(180).setDuration(500).setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { dismiss(); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); } }); return d; } } 

Funciona bien con:

 new MyDIalog().show(getFragmentManager(),"dialog"); 

De cualquier manera, puede programar la llamada dismiss() un poco más tarde mediante:

  @Override public void onAnimationEnd(Animator animator) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { dismiss(); } }); } 

Puedes usarlo así.

 @Override public void onAnimationEnd(Animation animation) { Handler handler = new Handler(); handler.post(new Runnable() { @Override public void run() { dismiss(); } }); } 

Aquí, la ventaja es que usted no define su propio tiempo, de esta manera puede ayudar a mantener todo lo demás simple, como un usuario puede sorprender incluso en un corto período de tiempo si el diálogo mantenido sin descartar después de la animación termina.

  • OnCancelListener no se llama en DialogFragment
  • ¿Debe ser una clase DialogFragment interna estática o no?
  • DialogFragment no cambia el tamaño cuando se muestra el teclado
  • Pasar argumento a DialogFragment
  • Pantalla completa DialogFragment
  • DialogFragment establecer altura de diálogo
  • DailogFragment - getArguments / setArguments - ¿por qué pasar los argumentos en un lote?
  • Cómo agregar un fragmento a un diseño de un DialogFragment?
  • Disposición de esquina redonda de Android en el cuadro de diálogo
  • RecyclerView in DialogFragment -> arrastre y suelte (swap) retrasos de animación
  • DialogFragment pérdida de memoria
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.