Android cambiar dinámicamente el estilo en tiempo de ejecución
Me gustaría hacer mis tamaños de fuente configurables, pero también me gustaría hacer uso de la etiqueta de estilo en mis diseños. ¿Es posible cambiar la definición de un estilo en tiempo de ejecución? O es la única opción para cambiar manualmente los elementos de estilo individuales en cada vista de texto, etc.?
- ¿Por qué utilizar putFloat (clave de cadena, valor de flotante), putInt (clave de cadena, valor de int) en lugar de sobrecarga poner (...)
- Aplicar un estilo a todos los diálogos (diálogo giratorio, diálogo de alertas, etc.)
- ¿Por qué el margen anula marginLeft en Android (mismo con radio, etc)?
- ¿Debo inflar un diseño o crearlo mediante programación?
- ¿Cómo usar SQLiteOpenHelper sin el uso menos restrictivo de Contexto?
- Estado de artículo personalizado para selectores de android
- Cambio de estilo TextView state_pressed / state_focused / state_selected
- ¿Por qué la mayoría de los campos (miembros de la clase) en el tutorial de Android empiezan con `m`?
- Error al recuperar el padre del elemento: No se encontró ningún recurso que coincida con el nombre dado '@android: style / TextAppearance.Holo.Widget.ActionBar.Title'
- Android: Estilo de preferencia
- ¿Cuál fue el uso de @ en el archivo xml con el atributo padre en estilo
- Android cambiar el estilo dinámicamente
- Estilo de código de Android en Intellij Idea / Android Studio
Cambiar el estilo después de crear la vista no es compatible .. así que lo que puede hacer es:
- Crear un nuevo archivo xml android de los valores de tipo
- Añadir nuevo tema
- Agregue sus elementos a ese tema y sus valores y guarde el archivo
Ahora, cuando está creando dinámicamente la nueva vista, llama al constructor que permitirá definir un defStyle. A continuación, señala el ID de estilo que acaba de crear señalando R. "el nombre de archivo XML". "Su ID de estilo"
myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
El siguiente código de ejemplo cambia el tamaño / estilo del texto dinámicamente en tiempo de ejecución.
Attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- View styles --> <attr name="textTitle" format="reference" /> <attr name="textBody" format="reference" /> </resources>
Styles.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="small_title_text"> <item name="android:textSize">22sp</item> <item name="android:textColor">@color/green</item> <item name="android:textStyle">normal</item> <item name="android:paddingBottom">5dip</item> </style> <style name="small_body_text"> <item name="android:textSize">16sp</item> <item name="android:textColor">@color/white</item> <item name="android:textStyle">normal</item> <item name="android:paddingBottom">5dip</item> </style> <style name="large_title_text"> <item name="android:textSize">28sp</item> <item name="android:textColor">@color/red</item> <item name="android:textStyle">normal</item> <item name="android:paddingBottom">5dip</item> </style> <style name="large_body_text"> <item name="android:textSize">20sp</item> <item name="android:textColor">@color/white</item> <item name="android:textStyle">normal</item> <item name="android:paddingBottom">5dip</item> </style> <!-- Base application theme is the default theme. --> <style name="Theme" parent="android:Theme"> </style> <style name="Theme.Small"> <item name="textTitle">@style/small_title_text</item> <item name="textBody">@style/small_body_text</item> </style> <style name="Theme.Large"> <item name="textTitle">@style/large_title_text</item> <item name="textBody">@style/large_body_text</item> </style> </resources>
Main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RadioButton android:text="Large Text" android:id="@+id/textSizeLarge" android:layout_width="wrap_content" android:layout_height="wrap_content"> </RadioButton> <RadioButton android:text="Small Text" android:id="@+id/textSizeSmall" android:layout_width="wrap_content" android:layout_height="wrap_content"> </RadioButton> </RadioGroup> <TextView android:id="@+id/title" style="?textTitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Select the size of the text" /> <TextView android:id="@+id/body" style="?textBody" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/message" /> </LinearLayout>
Actividad.java
public void onCreate(Bundle savedInstanceState) { if ("Large".equalsIgnoreCase( getIntent().getStringExtra( "Theme" ))) { setTheme(R.style.Theme_Large); } else if ("Small".equalsIgnoreCase( getIntent().getStringExtra( "Theme" ))) { setTheme(R.style.Theme_Small); } super.onCreate(savedInstanceState); setContentView(R.layout.main); RadioButton largeText = ( RadioButton ) findViewById( R.id.textSizeLarge ); largeText.setOnClickListener( new OnClickListener() { public void onClick( View view ) { Toast.makeText(context, "Large Text Selected", Toast.LENGTH_SHORT).show(); Intent intent = getIntent(); intent.putExtra( "Theme", "Large" ); finish(); startActivity(intent); } } ); RadioButton smallText = ( RadioButton ) findViewById( R.id.textSizeSmall ); smallText.setOnClickListener( new OnClickListener() { public void onClick( View view ) { Toast.makeText(context, "Small Text Selected", Toast.LENGTH_SHORT).show(); Intent intent = getIntent(); intent.putExtra( "Theme", "Small" ); finish(); startActivity(intent); } } ); }
No estoy seguro si esto funcionará en tu caso, pero puedes crear temas que definan tus estilos. Hay Activity.setTheme()
que se pasa en un archivo XML de tema. El tema contiene un puñado de definiciones.
Sólo lo he utilizado para anular ciertos estilos globales, como el color de fondo, no sé si puede utilizarlo para definir estilos que utilizarán sus widgets. Vale la pena darle un tiro sin embargo. Si funciona, por favor hágamelo saber!
- Cómo encontrar el tiempo es hoy o ayer en android
- ¿Cómo puedo abrir un nuevo fragmento de otro fragmento