android在运行时dynamic改变风格

我想使我的字体大小可configuration,但我也想在我的布局使用样式标记。 是否有可能在运行时更改风格的定义? 或者是手动更改每个文本视图中的单个样式元素等的唯一select?

不支持创build视图后更改样式..所以你可以做的是:

  1. 创build一个新的types值的android xml文件
  2. 添加新的主题
  3. 将您的元素添加到该主题及其值,并保存该文件

现在,当你dynamic创build新的视图时,你可以调用允许定义一个defStyle的构造函数。 然后,通过指向R“XML文件名”指向刚刚创build的样式ID。“样式ID”

myTextView.setTextAppearance(getApplicationContext(), R.style.boldText); 

以下示例代码在运行时dynamic改变文本的大小/样式。

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> 

Activity.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); } } ); } 

我不确定这是否适用于您的情况,但您可以创build定义您的样式的主题。 有一个Activity.setTheme()是你在主题XML文件中传递的。 主题包含一堆定义。

我只用它来覆盖某些全局样式,如背景颜色,我不知道是否可以使用它来定义您的小部件将使用的样式。 不过值得一试。 如果有效,请让我知道!