Estoy tratando de establecer el tema de un fragmento.
Establecer el tema en el manifiesto no funciona:
android:theme="@android:style/Theme.Holo.Light"
Al mirar blogs anteriores, parece que tengo que usar un ContextThemeWrapper. ¿Alguien puede referirme a un ejemplo codificado? No encuentro nada.
android
android-fragments
android-theme
usuario1232691
fuente
fuente
Fragmento toma su tema de su Actividad. A cada fragmento se le asigna el tema de la Actividad en la que existe.
El tema se aplica en el método Fragment.onCreateView, donde su código crea vistas, que en realidad son objetos donde se usa el tema.
En Fragment.onCreateView obtienes el parámetro LayoutInflater, que infla las vistas y contiene el contexto utilizado para el tema, en realidad esta es la actividad. Entonces, sus vistas infladas usan el tema de Actividad.
Para anular el tema, puede llamar a LayoutInflater.cloneInContext , que menciona en Docs que puede usarse para cambiar el tema. Puede utilizar ContextThemeWrapper aquí. Luego use el inflador clonado para crear las vistas del fragmento.
fuente
Para aplicar un solo estilo que he usado solo
en
onCreateView()
el fragmento antes de inflar la vista de raíz del fragmento y funciona para mí.fuente
getContext()
También estaba tratando de que mi diálogo de fragmentos se mostrara con un tema diferente a su actividad, y seguí esta solución . Como algunas personas mencionaron en los comentarios, no lo estaba haciendo funcionar y el diálogo seguía mostrándose con el tema especificado en el manifiesto. El problema resultó ser que estaba construyendo el diálogo usando
AlertDialog.Builder
elonCreateDialog
método y, por lo tanto, no estaba haciendo uso delonCreateView
método como se muestra en la respuesta a la que me vinculé. Y cuando estaba instanciando elAlertDialog.Builder
, estaba pasando en el contexto usandogetActivity()
cuando debería haber estado usando el instanciado en suConstextThemeWrapper
lugar.Aquí está el código para mi onCreateDialog:
Originalmente tuve la
AlertDialog.Builder
instancia de la siguiente manera:que cambié a:
Después de este cambio, el diálogo del fragmento se mostró con el tema correcto. Entonces, si alguien más tiene un problema similar y está utilizando el
AlertDialog.Builder
, verifique el contexto que se pasa al constructor. ¡Espero que esto ayude! :)fuente
Asegúrese de haber
android:minSdkVersion="11"
establecido en su manifiesto. Esta podría ser la causa por la que el ejemplo de David no funcionó para usted.Además, establezca el
android:theme="@android:style/Theme.Holo.Light"
atributo para la<application>
etiqueta y NO la<activity>
etiqueta.Otro posible problema podría ser la forma en que obtiene su contexto cuando usa un
ContextThemeWrapper()
. Si usa algo comogetActivity().getApplicationContext()
simplemente reemplácelo congetActivity()
.Normalmente, Theme.Holo debería aplicarse a Fragmentos vinculados a MainActivity.
Tenga en cuenta que utiliza un ContextThemeWrapper cuando desea aplicar un tema diferente para su Fragmento. Podría ayudar si proporciona el fragmento de código, desde su MainActivity, donde agrega sus Fragmentos.
Algunos enlaces útiles:
ListView personalizado en Fragmento no se adhiere al tema principal
fuente
Probé la solución que David sugirió que funcionaba, pero no en todos los escenarios:
1. para el primer fragmento que se agregó a la pila tiene el tema de la actividad y no el que se definió en onCrateView, sino en el segundo fragmento que agregar a la pila corregirlos se aplicó en el fragmento.
2. En el segundo fragmento que los mostraba correctamente, hice lo siguiente: obligué a cerrar la aplicación limpiando la memoria, volví a abrir la aplicación y cuando la actividad se recreó con el fragmento El fragmento cambió los errores de la Actividad y no la misma que se estableció en el onCrateView del fragmento.
Para solucionar el problema, hice un pequeño cambio y reemplacé el argumento del contenedor de inflater.inflate con un valor nulo.
No sé cómo el inflador usa en algunos escenarios el contexto de la vista del contenedor.
Nota: estoy usando android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity.
fuente
Sé que es un poco tarde, pero podría ayudar a alguien más porque esto me ayudó.También puede intentar agregar la línea de código a continuación dentro de la función onCreatView del fragmento
fuente
Cree una clase Java y luego use el diseño del que desea cambiar el tema en el método onCreate.Luego menciónelo en el manifiesto como normal
fuente
Si solo desea aplicar estilo para un fragmento en particular, simplemente agregue estas líneas antes de llamar
onCreateView()
oonAttach()
del fragmento,y si desea establecer una barra de estado transparente, establezca falso en la
fitsSystemWindows
propiedad de su diseño raíz,fuente
Lo hice funcionar configurando el tema en el contexto del fragmento antes de llamar al inflador.
NOTA: Este es un ejemplo de Xamarin.Android en combinación con MvvmCross. No estoy 100% seguro de si esto también funcionará para los programadores de Java. Pero puedes intentar :)
El código del método de extensión SetTheme
Espero que esto ayude a algunas personas, ¡salud!
fuente
Resolví el problema usando
android:theme = "@style/myTheme"
el archivo de diseño del fragmento. Por ejemplo, esto cambia el estilo delLinearLayout
y su contenido, pero nada fuera delLinearLayout
. Por lo tanto, para decorar todo el fragmento con cualquier estilo, aplique el tema a su diseño principal externo.Nota: en caso de que aún no haya encontrado una solución, puede intentarlo.
fuente
puedes probar esto para piruletas en onAttach
ventana final de la ventana = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
y vuelva a configurarlo por defecto en ondettach
fuente