DialogFragments con dispositivos api level <11
Estoy en el proceso de hacer un proyecto / horquilla de nido de abeja compatible con 1.6+.
De acuerdo con la documentación proporcionada por Google / Android decidí construir fuera de todos mis fragmentos fuera de DialogFragment
s que trabajó grande para el panal … que me da la flexibilidad para poner cualquier cosa como un cuadro de diálogo o elemento de "pantalla completa".
- FloatingActionButton expandir en una nueva actividad
- Agregue fragmentos al host Tab
- SetOnClickListener (nuevo OnClickListener () no funciona en Fragment
- Variables de miembro vs setArguments en Fragments
- Acciones en onActivityResult y "Error No se puede realizar esta acción después de onSaveInstanceState"
Ahora he incorporado el kit de compatibilidad y movido mis llamadas de importaciones y método a eso. Ahora que estoy en 2.3 Estoy intentando lanzar una intención idéntica pero recibo este problema:
java.lang.IllegalStateException: DialogFragment can not be attached to a container view
La documentación de DialogFragment
sugiere que puede realizarse como Fragment
cuando no desea la funcionalidad de diálogo / popup.
- Fragmento newInstance ¿por qué usar argumentos?
- Cómo obtener la barra de herramientas de fragmento?
- Cómo llamar a fragment method de la actividad principal
- ViewPager con fragmentos anidados?
- Selector de fecha de Android en un diálogo
- ViewPager y FragmentPagerAdapter con fragmentos (no la biblioteca de soporte)
- Añadir fragmento en un fragmento (fragmento anidado)
- ¿Cómo dejar que sólo fragmentos específicos desplazarse dentro de un ViewPager de CoordinatorLayout?
Me las arreglé para solucionar esto correctamente en DialogFragment.java
del paquete de compatibilidad:
Cambiar la línea 74: boolean mShowsDialog = false;
Comentario línea 232: //mShowsDialog = mContainerId == 0;
A continuación, cambie los dos métodos de show a esto:
public void show(FragmentManager manager, String tag) { this.setShowsDialog(true); FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commit(); } // JavaDoc removed public int show(FragmentTransaction transaction, String tag) { this.setShowsDialog(true); transaction.add(this, tag); mRemoved = false; mBackStackId = transaction.commit(); return mBackStackId; }
Básicamente, se escribió en apoyo, pero la alternancia para cambiar entre diálogo / incrustado no funciona.
Por lo tanto, aquí por defecto para incrustado, y luego establecer para mostrar como un diálogo justo antes de mostrarlo.
He tenido el mismo problema. Nunca encontré una solución "correcta", pero puedes hacer lo mismo estableciendo el tema del Diálogo en OnCreateDialog()
. Al configurar el tema en android.R.style.Theme_Holo_DialogWhenLarge
el diálogo se mostrará como un diálogo en pantallas grandes y xlarge, mientras que se mostrará como una ventana de pantalla completa en pantallas pequeñas y normales.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_DialogWhenLarge); }
Estoy utilizando una clase de niño de DialogFragment y haciendo este truco en las obras de onCreate (). Llamo setShowsDialog () antes de llamar onCreate () (en el onAttachFragment () de mi Actividad)
public class DialogFragmentHosted extends DialogFragment { @Override public void onCreate(Bundle savedInstanceState) { boolean forceShowDialog = savedInstanceState==null; boolean showsDialog = getShowsDialog(); super.onCreate(savedInstanceState); if (forceShowDialog ) setShowsDialog(showsDialog); } }
Puede usar la versión de android.support.v4.app.DialogFragment, por favor marque aquí
¿Revisó la nota de aplicación? Muestra una forma recomendada de incrustar un diálogo, y he verificado esto funciona en 2.2.1.
http://developer.android.com/reference/android/app/DialogFragment.html#DialogOrEmbed
Mi diseño del fragmento tenía que cambiar para conformarse pero era rápido y fácil. Es más natural ser capaz de definir el fragmento de diálogo en XML y esperar que se incruste sin ningún trabajo adicional (como los cambios anteriores a la API Compat sería compatible); Y para esperar sólo el comportamiento modal cuando se llama a través de show (). Supongo que no es el comportamiento actual.