Android: configure el estilo de visualización mediante progtwigción

Aquí está XML:

   

¿Cómo establecer el atributo de style progtwigción?

Técnicamente, puede aplicar estilos programáticamente, con vistas personalizadas de todos modos:

 private MyRelativeLayout extends RelativeLayout { public MyRelativeLayout(Context context) { super(context, null, R.style.LightStyle); } } 

El constructor de un argumento es el que se usa cuando instancia las vistas mediante progtwigción.

Entonces encadena este constructor al super que toma un parámetro de estilo.

 RelativeLayout someLayout = new MyRelativeLayout(context); 

O como @Dori señaló simplemente:

 RelativeLayout someLayout = new RelativeLayout(context, null, R.style.LightStyle); 

Lo que funcionó para mí:

 Button b = new Button(new ContextThemeWrapper(this, R.style.ButtonText), null, 0); 
  • Use un ContextThemeWrapper

Y

  • Usa el constructor de 3 argumentos (no funcionará sin esto)

No puede establecer el estilo de una vista mediante progtwigción todavía, pero puede encontrar este hilo útil.

Actualización : en el momento de responder esta pregunta (mediados de 2012, nivel API 14-15), establecer la vista mediante progtwigción no era una opción (aunque hubo algunas soluciones temporales no triviales) mientras que esto ha sido posible después de la API más reciente lanzamientos. Ver la respuesta de @ Blundell para más detalles.

Puede aplicar un estilo a su actividad haciendo:

 super.setTheme( R.style.MyAppTheme ); 

o por defecto de Android:

 super.setTheme( android.R.style.Theme ); 

en su actividad, antes de setContentView() .

Ninguna de las respuestas proporcionadas es correcta.

PUEDE establecer el estilo programáticamente.

La respuesta breve es echar un vistazo a http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/content/Context.java#435

Respuesta larga. Aquí está mi fragmento para establecer estilo definido personalizado programáticamente en su vista:

1) Crea un estilo en tu archivo styles.xml

   

No olvide definir sus atributos personalizados en el archivo attrs.xml

Mi archivo attrsl.xml:

     

Observe que puede usar cualquier nombre para su estilo (mi CustomWidget)

Ahora vamos a establecer el estilo en el widget Progtwigtivamente Aquí está mi widget simple:

 public class StyleableWidget extends LinearLayout { private final StyleLoader styleLoader = new StyleLoader(); private TextView textView; private View divider; public StyleableWidget(Context context) { super(context); init(); } private void init() { inflate(getContext(), R.layout.widget_styleable, this); textView = (TextView) findViewById(R.id.text_view); divider = findViewById(R.id.divider); setOrientation(VERTICAL); } protected void apply(StyleLoader.StyleAttrs styleAttrs) { textView.setTextColor(styleAttrs.textColor); divider.setBackgroundColor(styleAttrs.dividerColor); } public void setStyle(@StyleRes int style) { apply(styleLoader.load(getContext(), style)); } } 

diseño:

    

Y finalmente la implementación de la clase StyleLoader

 public class StyleLoader { public StyleLoader() { } public static class StyleAttrs { public int textColor; public int dividerColor; } public StyleAttrs load(Context context, @StyleRes int styleResId) { final TypedArray styledAttributes = context.obtainStyledAttributes(styleResId, R.styleable.CustomWidget); return load(styledAttributes); } @NonNull private StyleAttrs load(TypedArray styledAttributes) { StyleAttrs styleAttrs = new StyleAttrs(); try { styleAttrs.textColor = styledAttributes.getColor(R.styleable.CustomWidget_customTextColor, 0); styleAttrs.dividerColor = styledAttributes.getColor(R.styleable.CustomWidget_customDividerColor, 0); } finally { styledAttributes.recycle(); } return styleAttrs; } } 

Puede encontrar un ejemplo completamente funcional en https://github.com/Defuera/SetStylableProgtwigtically

Para un nuevo Button / TextView:

 Button mMyButton = new Button(new ContextThemeWrapper(this, R.style.button_disabled), null, 0); 

Para una instancia existente:

 mMyButton.setTextAppearance(this, R.style.button_enabled); 

Para Imagen o diseños:

 Image mMyImage = new ImageView(new ContextThemeWrapper(context, R.style.article_image), null, 0); 

Si desea continuar utilizando XML (que la respuesta aceptada no le permite) y establecer el estilo después de que se haya creado la vista, es posible que pueda utilizar la biblioteca de París que admite un subconjunto de todos los atributos disponibles.

Como está inflando su vista desde XML, deberá especificar una identificación en el diseño:

  

Luego, cuando necesite cambiar el estilo de forma programática, una vez que se haya inflado el diseño:

 // Any way to get the view instance will do RelativeLayout myView = findViewById(R.id.my_styleable_relative_layout); // This will apply all the supported attribute values of the style Paris.style(myView).apply(R.style.LightStyle); 

Para obtener más información: la lista de tipos de vista y atributos admitidos (incluye fondo, relleno, margen, etc. y puede ampliarse fácilmente) e instrucciones de instalación con documentación adicional .

Descargo de responsabilidad: soy el autor original de dicha biblioteca.

Utilicé las vistas definidas en XML en mi ViewGroup compuesto, las agregué a Viewgroup. De esta forma no puedo cambiar el estilo de forma dinámica, pero puedo hacer algunas personalizaciones de estilo. Mi compuesto:

 public class CalendarView extends LinearLayout { private GridView mCalendarGrid; private LinearLayout mActiveCalendars; private CalendarAdapter calendarAdapter; public CalendarView(Context context) { super(context); } public CalendarView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); init(); } private void init() { mCalendarGrid = (GridView) findViewById(R.id.calendarContents); mCalendarGrid.setNumColumns(CalendarAdapter.NUM_COLS); calendarAdapter = new CalendarAdapter(getContext()); mCalendarGrid.setAdapter(calendarAdapter); mActiveCalendars = (LinearLayout) findViewById(R.id.calendarFooter); } 

}

y mi vista en xml donde puedo asignar estilos:

    

Este es mi ejemplo simple, la clave es el contenedor ContextThemeWrapper , sin él, mi estilo no funciona y usa el constructor de tres parámetros de la Vista.

 ContextThemeWrapper themeContext = new ContextThemeWrapper(this, R.style.DefaultLabelStyle); TextView tv = new TextView(themeContext, null, 0); tv.setText("blah blah ..."); layout.addView(tv); 

Puede crear el xml que contiene el diseño con el estilo deseado y luego cambiar el recurso de fondo de su vista, así.