我想在我的应用中有两个主题:一个字体大小正常,一个字体较小。我需要动态更改活动onCreate
或onStart
。
我已经定义了两个主题(文件themes.xml
):
<style name="AppBaseTheme" parent="android:Theme.Light">
</style>
<!-- Default theme with normal font size. This one is set for the whole app in the manifest -->
<style name="NormalTheme" parent="AppBaseTheme">
<item name="android:textAppearance">@style/NormalTextSize</item>
<item name="android:textAppearanceLarge">@style/NormalTextSize.Large</item>
<item name="android:textAppearanceMedium">@style/NormalTextSize.Medium</item>
<item name="android:textAppearanceSmall">@style/NormalTextSize.Small</item>
<item name="android:editTextStyle">@style/EditText_NormalTextSize</item>
</style>
<!-- Small font size -->
<style name="SmallFontTheme" parent="NormalTheme">
<item name="android:textAppearance">@style/SmallTextSize</item>
<item name="android:textAppearanceLarge">@style/SmallTextSize.Large</item>
<item name="android:textAppearanceMedium">@style/SmallTextSize.Medium</item>
<item name="android:textAppearanceSmall">@style/SmallTextSize.Small</item>
<item name="android:editTextStyle">@style/EditText_SmallTextSize</item>
</style>
在styles.xml
文件中,我为每个主题定义了样式集:
<!-- Normal font -->
<style name="NormalTextSize" parent="@android:style/TextAppearance">
<item name="android:textSize">16sp</item>
</style>
<style name="NormalTextSize.Large" >
<item name="android:textSize">22sp</item>
</style>
<style name="NormalTextSize.Medium" >
<item name="android:textSize">18sp</item>
</style>
<style name="NormalTextSize.Small" >
<item name="android:textSize">14sp</item>
</style>
<style name="EditText_NormalTextSize" parent="@android:style/Widget.EditText">
<item name="android:textSize">16sp</item>
</style>
<!-- Small font -->
<style name="SmallTextSize" parent="@android:style/TextAppearance">
<item name="android:textSize">14sp</item>
</style>
<style name="SmallTextSize.Large" >
<item name="android:textSize">20sp</item>
</style>
<style name="SmallTextSize.Medium" >
<item name="android:textSize">16sp</item>
</style>
<style name="SmallTextSize.Small" >
<item name="android:textSize">12sp</item>
</style>
<style name="EditText_SmallTextSize" parent="@android:style/Widget.EditText">
<item name="android:textSize">14sp</item>
</style>
为了测试主题更改,我创建了一个活动,并添加了两个TextView(一个带有textAppearanceLarge
,另一个带有textAppearanceSmall
)。我还添加了EditText和列表视图。我没有触及这些视图上的任何样式属性,我将它们放在布局编辑器中时保持原样。我的目标是更改整个应用程序的主题,而无需为每个小部件定义样式或外观。
我还添加了一些按钮来触发主题更改:新主题资源ID存储在首选项中,然后活动自行完成,并启动对同一测试活动的新Intent。该活动会在onCreate
或onStart
中读取当前主题设置并调用setTheme
。此主题设置更改有效,但只有ListView正在调整文本大小:TextViews
和EditText
不会调整大小。
所以我的问题是我到底做错了什么。我已经按照3-4篇教程进行了操作,我的风格与它应该工作的内容一致。
注意我只覆盖了主题中的文本外观,因为我认为几乎每个基于文本的窗口小部件都会根据外观单独调整大小(当从布局编辑器中删除时,每个窗口小部件都有外观)。我曾经在某个地方徘徊,它不会那样工作(如果是这样,谷歌的好工作),你需要为主题内的每种小部件定义文本大小。在上面的示例中,我已经覆盖editTextStyle
并且无法正常工作。我也尝试过具有相同结果的按钮和文本视图。但令我困惑的是,ListView是屏幕上最复杂的小部件,它正确调整大小而不为其定义样式,而最简单的小部件则不是,即使为这些特定类型的小部件定义样式!