我在我的 android 应用程序中使用主题来根据清单中当前选择的主题来控制将哪些样式应用于每个元素。
在任何一个主题(其中可能有很多)中,都有许多样式我想在运行时在它们之间切换。例如,我有一个样式定义了文本的正常外观,另一种样式定义了当代码输入错误时同一段文本的外观。
我不能直接引用@style,因为这是由主题决定的。
我制作了一个示例应用程序来说明我的问题(请注意,下面的片段省略了一些不相关的点点滴滴)
Attrs.xml:(我的自定义资源引用,所以我的布局不直接引用样式)
<resources>
<attr name="theme_style_one" format="reference" />
<attr name="theme_style_two" format="reference" />
</resources>
Themes.xml:(根据主题选择合适的样式应用)
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="ThemeOne" parent="android:Theme">
<item name="theme_style_one">@style/blue</item>
<item name="theme_style_two">@style/red</item>
</style>
<style name="ThemeTwo" parent="android:Theme">
<item name="theme_style_one">@style/green</item>
<item name="theme_style_two">@style/red</item>
</style>
</resources>
Styles.xml(样式本身)
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="blue">
<item name="android:textColor">@color/color_blue</item>
</style>
<style name="red">
<item name="android:textColor">@color/color_red</item>
</style>
<style name="green">
<item name="android:textColor">@color/color_green</item>
</style>
</resources>
Colors.xml(只是一些颜色)
<resources>
<color name="color_blue">#0000FF</color>
<color name="color_green">#00FF00</color>
<color name="color_red">#FF0000</color>
</resources>
活动主布局:
<TextView
android:id="@+id/txt_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/hello_world"
style="?theme_style_one" />
activity_main 的 onCreate:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView)findViewById(R.id.txt_text);
textView.setTextAppearance(this, R.attr.theme_style_two);
}
我想要实现的是以编程方式将 TextView 的样式更改为“theme_style_two”。“SetTextAppearance”命令无效。我无法在此命令中直接引用 @style/blue,因为如果我更改清单中的主题,则会应用不正确的样式。
任何帮助将非常感激!