Establecer el tema para un fragmento

Estoy tratando de establecer el tema para un fragmento.

Establecer el tema en el manifiesto no funciona:

android:theme="@android:style/Theme.Holo.Light" 

Al mirar blogs anteriores, parece como si tuviera que usar ContextThemeWrapper. ¿Alguien puede referirme a un ejemplo codificado? No puedo encontrar nada.

Establecer el tema en manifiesto se usa generalmente para la actividad.

Si desea establecer Theme for Fragment, agregue el siguiente código en onCreateView () del Fragment:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, container, false); } 

También estaba tratando de mostrar mi diálogo de fragmentos con un tema diferente a su actividad, y seguí esta solución . Al igual que algunas personas mencionadas en los comentarios, no conseguía que funcionara 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 en el método onCreateDialog y por lo tanto no estaba haciendo uso del método onCreateView como se muestra en la respuesta a la que me he vinculado. Y cuando estaba creando una instancia de AlertDialog.Builder , estaba pasando el contexto usando getActivity() cuando debería haber estado usando el ConstextThemeWrapper instanciado en ConstextThemeWrapper lugar.

Aquí está el código para mi onCreateDialog:

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Create ContextThemeWrapper from the original Activity Context ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog); LayoutInflater inflater = getActivity().getLayoutInflater().cloneInContext(contextThemeWrapper); // Now take note of the parameter passed into AlertDialog.Builder constructor AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper); View view = inflater.inflate(R.layout.set_server_dialog, null); mEditText = (EditText) view.findViewById(R.id.txt_server); mEditText.requestFocus(); // Show soft keyboard automatically mEditText.setOnEditorActionListener(this); builder.setView(view); builder.setTitle(R.string.server_dialog); builder.setPositiveButton(android.R.string.ok, this); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(false); return dialog; } 

Originalmente tuve el AlertDialog.Builder instanciado de la siguiente manera:

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

que cambié a:

 AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper); 

Después de este cambio, se mostró el diálogo del fragmento con el tema correcto. Entonces, si alguien más está teniendo un problema similar y está haciendo uso de AlertDialog.Builder entonces verifique el contexto que se está pasando al constructor. ¡Espero que esto ayude! 🙂

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 el 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 mantiene el contexto utilizado para el tema, en realidad esta es la actividad. Entonces tus vistas infladas usan el tema de Activity.

Para anular el tema, puede llamar a LayoutInflater.cloneInContext , que menciona en los documentos que se puede usar para cambiar el tema. Puede usar ContextThemeWrapper aquí. Luego usa un inflador clonado para crear vistas de fragmentos.

Asegúrese de tener android:minSdkVersion="11" establecido en su manifiesto. Esta podría ser la causa por la cual el ejemplo de David no funcionó para ti.

Además, configure el atributo android:theme="@android:style/Theme.Holo.Light" para la etiqueta y NO para la etiqueta .

Otro posible problema podría ser la forma en que obtiene su Contexto cuando usa ContextThemeWrapper() . Si usa algo como getActivity().getApplicationContext() simplemente reemplácelo con getActivity() .

Normalmente, Theme.Holo debe aplicarse a los Fragmentos vinculados a MainActivity.

Tenga en cuenta que utiliza ContextThemeWrapper cuando desea aplicar un tema diferente para su Fragmento. Podría ser útil si proporciona el fragmento de código de su actividad principal, donde agrega sus fragmentos.

Algunos enlaces útiles:

Vista de lista personalizada en Fragmento que no se adhiere al tema principal

Para aplicar un solo estilo que he usado solo

 getContext().getTheme().applyStyle(styleId, true); 

en onCreateView() del fragmento antes de inflar la vista raíz del fragmento y funciona para mí.

Probé la solución que David sugirió que funcionó, pero no en todos los escenarios:
1. Para el primer fragmento que se agregó a la stack tiene el tema de la actividad y no el que se definió en onCrateView, pero en el segundo fragmento que agregué a la stack los corrigió se aplicó en el fragmento.

2. En el segundo fragmento que los mostraba correctamente, hice lo siguiente forcé la aplicación para que se cerrara limpiando la memoria, volví a abrir la aplicación y cuando la actividad se recreaba con el fragmento El fragmento los cambiaba. 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 contenedor de inflater.inflate con un nulo.

No sé cómo el inflador usa en algunos escenarios el contexto de la vista de contenedor.

Tenga en cuenta que estoy utilizando android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, null, false); } 

Cree una clase java y luego use el diseño en el que desea cambiar el tema en el método onCreate. Luego mencione en manifiesto como normal

Resolví el problema usando android:theme = "@style/myTheme" en el archivo de diseño del fragmento. Por ejemplo, esto cambia el estilo de LinearLayout y su contenido, pero no es algo fuera de LinearLayout . Por lo tanto, para decorar todo el fragmento con cualquier estilo, aplique el tema a su diseño principal externo.

      

puedes probar esto para lollipop en onAttach

Ventana ventana final = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)

y configurarlo de nuevo por defecto en ondettach

Si solo desea aplicar estilo para un fragmento en particular, simplemente agregue estas líneas antes de llamar onCreateView() o onAttach() del fragmento,

 getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT); 

y si desea establecer una barra de estado transparente, establezca false en la propiedad fitsSystemWindows de su diseño raíz,

 android:fitsSystemWindows="false"