【发布时间】:2010-07-13 21:34:23
【问题描述】:
我想让我的字体大小可配置,但我也想在我的布局中使用样式标签。是否可以在运行时更改样式的定义?还是手动更改每个 textview 等上的单个样式元素的唯一选择?
【问题讨论】:
标签: android coding-style
我想让我的字体大小可配置,但我也想在我的布局中使用样式标签。是否可以在运行时更改样式的定义?还是手动更改每个 textview 等上的单个样式元素的唯一选择?
【问题讨论】:
标签: android coding-style
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);
}
} );
}
【讨论】:
不支持创建视图后更改样式..所以你可以做的是:
现在,当您动态创建新视图时,您将调用允许定义 defStyle 的构造函数。然后,通过指向 R."the XML file name"."your style ID"
来指向刚刚创建的样式 IDmyTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
【讨论】:
我不确定这是否适用于您的情况,但您可以创建定义您的样式的主题。 Activity.setTheme() 是您在主题 XML 文件中传递的。主题包含一堆定义。
我只使用它来覆盖某些全局样式,例如背景颜色,我不知道您是否可以使用它来定义小部件将使用的样式。不过值得一试。如果有效,请告诉我!
【讨论】: