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:
- Configurar el tamaño de un DialogFragment
- ¿Es posible iniciar un DialogFragment desde una preferencia en una preferenciaActivity?
- Destruye DialogFragment en onCreateDialog ()
- Dialog FLAG_DIM_BEHIND no funciona en Android 5.x (Lollipop)
- Deshabilitar el botón positivo / negativo en DialogFragment
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>
- AlertDialog con vista personalizada: redimensionar para ajustar el contenido de la vista
- Android: FragmentTransaction ocultar no funciona para DialogFragment
- No se encontró ninguna vista para id - DialogFragment + Fragment
- DialogFragment no se muestra después de agregar la ventana de alerta
- DialogFragment eliminar el borde negro
- Después de cambiar la orientación de la pantalla, el diálogo aparece aparentemente sin ninguna llamada
- Xamarin C # Android 7.0 en Moto G5 Plus teléfono, ventana de diálogo fragmento de fondo transparente procesamiento de error
- Cómo configurar el tamaño de fuente para el texto de los botones de diálogo
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.
- MediaMetadataRetriever en la fuente de transmisión
- La variable de cambio de nombre de Refactor en Android Studio Mac Shortcut no funciona