DialogFragment en Fragmento con rotación de pantalla
En mi actividad principal tengo un Fragmento en el que aplico setRetainInstance (true) para que el AsyncTask que uso en él no se altere por el cambio de orientación.
Mucho trabajo es procesado por el AsyncTask. Es por eso que me gustaría mostrar un diálogo con una barra de progreso en la parte superior de mi actividad.
- Android: gira todo el diseño
- Desactivar la rotación automática en fragmento
- Actividad de reinicio en la rotación de Android
- La orientación del grabador de vídeo JavaCV no es adecuada en modo retrato
- Android: gira el lienzo alrededor del centro de la pantalla
Hice algunas investigaciones y logré hacerlo con DialogFragment:
Public class DialogWait extends DialogFragment {
private ProgressBar progressBar; public DialogWait() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.dialog_wait, container); Dialog dialog = getDialog(); dialog.setTitle("Hello"); setCancelable(false); progressBar = (ProgressBar) view.findViewById(R.id.progress); return view; } public void updateProgress(int value) { progressBar.setProgress(value); }
Y aquí está mi AsyncTask:
public class InitAsyncTask extends AsyncTask<Void, Integer, Void> { private Context activity; private OnTaskDoneListener mCallback; private DialogWait dialog; public InitAsyncTask(Context context, OnTaskDoneListener callback, DialogWait dialogWait) { activity = context; mCallback = callback; dialog = dialogWait; } @Override protected Void doInBackground(Void... params) { doStuff(); return null; } @Override protected void onProgressUpdate(Integer... values) { dialog.updateProgress(values[0]); } @Override protected void onPostExecute(Void result) { publishProgress(100); if(dialog != null) dialog.dismiss(); mCallback.onTaskDone(); } private void doStuff() { //... }
}
Si no cambio la rotación de la pantalla, funciona bien. Pero si lo hago, el diálogo se descarta y unos segundos más tarde, tengo una NullPointerEsception que absurdo desde que establezco la condición: if (dialog! = Null)
¿Qué estoy haciendo mal?
- Cómo hacer menú giratorio
- Rotar de forma programable o dibujar
- Rotar una matriz de bytes YUV en Android
- Rotar ImageView en Android <Nivel de API 11
- Algunos fragmentos se pierden en rotación
- OnCreate no se llama cuando la pantalla gira - Android
- Cómo actualizar match_parent en un linearLayout después de usar setRotation?
- Rotar la vista de anuncio con API 8
Solución encontrada!
No estaba haciendo lo correcto con el Fragmento que contiene mi AsyncTask.
Porque, realmente no he entendido el concepto de orientación en Fragmento, lo entiendo gracias a este enlace: http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
onDestroyView
métodos onDestroyView
y onDestroyView
en su DialogWait
siguiente manera:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public void onDestroyView() { if (getDialog() != null && getRetainInstance()) { getDialog().setDismissMessage(null); } super.onDestroyView(); }
- Android AppWidget onUpdate en el arranque
- ¿Cómo evitar fallos debido a entradas de cadena faltantes?