Reputation: 16534
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.?
Upvotes: 43
Views: 75985
Reputation: 3664
Changing the style after creating the view is not supported .. so what you can do is:
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);
Upvotes: 19
Reputation: 1691
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);
}
} );
}
Upvotes: 101
Reputation: 77762
I'm not sure if this will work in your case, but you can create themes that define your styles. There's Activity.setTheme()
which you pass in a theme XML file. The theme contains a bunch of definitions.
I've only used it to override certain global styles, like background color, I don't know if you can use it to define styles that your widgets will use. It's worth giving it a shot though. If it works, please let me know!
Upvotes: 6