【问题标题】:android dynamically change style at runtimeandroid在运行时动态改变样式
【发布时间】:2010-07-13 21:34:23
【问题描述】:

我想让我的字体大小可配置,但我也想在我的布局中使用样式标签。是否可以在运行时更改样式的定义?还是手动更改每个 textview 等上的单个样式元素的唯一选择?

【问题讨论】:

标签: android coding-style


【解决方案1】:

以下示例代码会在运行时动态更改文本的大小/样式。

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>

ma​​in.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);
        }
    } );
}

【讨论】:

  • 我可以在运行时(创建后)更改按钮的主题吗?
【解决方案2】:

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

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

现在,当您动态创建新视图时,您将调用允许定义 defStyle 的构造函数。然后,通过指向 R."the XML file name"."your style ID"

来指向刚刚创建的样式 ID
myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);

【讨论】:

  • 在这里,我认为您为特定的文本视图设置了文本外观,如果我需要为 android textview 类设置相同的外观,以便它适用于所有文本视图,那么如何实现?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多