studio programación programacion herramientas gratis fundamentos curso con avanzado aplicaciones android android-layout

programacion - Android: configure el estilo de visualización mediante programación



manual android studio avanzado (8)

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)

Aquí está XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/LightStyle" android:layout_width="fill_parent" android:layout_height="55dip" android:clickable="true" android:orientation="horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" /> </RelativeLayout>

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


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

<style name="MyStyle"> <item name="customTextColor">#39445B</item> <item name="customDividerColor">#8D5AA8</item> </style>

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

Mi archivo attrsl.xml:

<declare-styleable name="CustomWidget"> <attr name="customTextColor" format="color" /> <attr name="customDividerColor" format="color" /> </declare-styleable>

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

Ahora vamos a establecer el estilo en el widget Programativamente 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:

<TextView android:id="@+id/text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:layout_gravity="center" android:text="@string/styleble_title" /> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="1dp"/> </merge>

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/SetStylableProgramatically


No puede establecer el estilo de una vista mediante programació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 programació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() .


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


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:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_styleable_relative_layout" style="@style/LightStyle" ...

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.


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 programació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);


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:

<com.mfitbs.android.calendar.CalendarView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/calendar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="vertical" > <GridView android:id="@+id/calendarContents" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/calendarFooter" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" />