Android 动态更改样式

4
我已经在styles.xml中描述了我的对象的属性(不用管对象是什么)。我想动态地在styles.xml中更改这些属性。有人知道如何做到吗?
3个回答

7
你可以这样做:
在Activity中:
this.setTheme(R.style.ThemeRed);

在styles.xml文件中:
<resources>
  <style name="ThemeBlack" parent="@android:style/Theme">
    <item name="android:textColor">#FFFFFF</item>
    <item name="android:typeface">sans</item>
    <<item name="android:background">#999999</item>
    <item name="android:textSize">16sp</item>
  </style>
  <style name="ThemeRed" parent="@android:style/Theme">
    <item name="android:textColor">#FFFFFF</item>
    <item name="android:typeface">sans</item>
    <item name="android:background">#c81111</item>
    <item name="android:textSize">16sp</item>
  </style>
</resources>

这很有趣,但它会更改当前活动的所有子视图的描述属性(但我只需要特定的视图)。 - davs

3

我看到了对这个问题的矛盾回答。这篇文章说 ,但这篇文章说 不是。我查看了 Android 文档中的 View,并没有找到任何 setStyle 方法。


1
同意,没有setStyle()方法。我不知道在运行时更改样式的方法。您可以逐个属性地更改由样式设置的大多数属性,但必须这样做。 - CommonsWare

0
我想在styles.xml文件中动态更改这些属性。
您想要更改什么?运行时应用的样式吗?
我认为您可以在代码中使用此方法实现。
TypedArray a =  context.obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)

在这里,我认为:

  1. AttributeSet set = null; 因为这是XML填充器提供的。

  2. int[] attrs = R.styleable.MyWidget; 定义了我想查看的属性。

  3. int defStyleAttr = myWidgetStyle; 这是一个引用,在我的主题中定义了MyWidget的样式。这两个都在res/values中的XML文件中定义。“myWidgetStyle”遵循了Android开发人员在他们的代码中使用的命名模式。

  4. defStyleRes = 0; 我希望我不需要考虑这个。

然后,要获取任何属性,例如背景颜色,

Color  color = a.getColor(R.styleable.MyWidget_background,  R.color.my_default);
a.recycle();

目前看来,这似乎有效。

Android构建系统似乎很方便地生成了在a.getColor中使用的正确索引,并将其命名为R.styleable.MyWidget_background。我没有创建这个名称,所以Android必须使用我的MyWidget样式XML来完成它。

我希望可以通过搜索所需属性的TypedArray来查找正确的索引,但那样效率低下,而且TypedArray看起来像是一个不愉快的装置。我会用一根非常长的棍子去戳它!

Don


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接