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.?

Cambiar el estilo después de crear la vista no es compatible .. así que lo que puede hacer es:

  1. Crear un nuevo archivo xml android de los valores de tipo
  2. Añadir nuevo tema
  3. 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!

  • Estilo de todas las vistas de texto (o vista personalizada) sin agregar el atributo de estilo a cada TextView
  • Cambiar dinámicamente el tema de la actividad
  • Normas de estilo de codificación para Android
  • Cómo configurar el atributo de estilo mediante programación en Android?
  • ¿Alguien creó el perfil del formateador de código de Java para Eclipse IDE que se ajusta a las reglas de estilo de código de Android?
  • Establecer el estilo de la barra de calificación del código
  • Android estilo estándar lengüeta legalidad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.