Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android dynamically change style at runtime

I'd like to make my font sizes configurable but i'd also like to make use of the style tag in my layouts. Is it possible to change the definition of a style at runtime? or is the only option to manually change the individual style elements on each textview etc.?

like image 808
Ben Avatar asked Jul 13 '10 21:07

Ben


2 Answers

Following sample code changes the size/style of the text dynamically on runtime.

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);         }     } ); } 
like image 194
Janarthanan Avatar answered Sep 28 '22 06:09

Janarthanan


Changing the style after creating the view is not supported .. so what you can do is:

  1. create a new android xml file of type values
  2. add new theme
  3. add your elements to that theme and their values and save the file

Now, when you are dynamically creating the new view you call the constructor that will allow to define a defStyle. Then, you point to the style ID you have just created by pointing to R."the XML file name"."your style ID"

myTextView.setTextAppearance(getApplicationContext(), R.style.boldText); 
like image 40
AhmadAssaf Avatar answered Sep 28 '22 04:09

AhmadAssaf