【问题标题】:android change style dynamicallyandroid动态改变样式
【发布时间】:2010-06-21 12:06:43
【问题描述】:

我已经在styles.xml 中描述了我的对象的属性(不管对象是什么)。我想在styles.xml 中动态更改这些属性。

有人知道我该怎么做吗?

【问题讨论】:

    标签: android coding-style


    【解决方案1】:

    你可以这样做:

    活动中:

    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>
    

    【讨论】:

    • 这很有趣,但它改变了 current ACTIVITY 的所有子视图的描述属性(但我只需要特定视图);
    【解决方案2】:

    我看到这个问题的答案自相矛盾。上面写着yes,但上面写着no。我查看了 View 的 android 文档,找不到任何 setStyle 方法。

    【讨论】:

    • 同意,没有setStyle() 方法。我知道没有办法在运行时改变你的风格。您可以在运行时更改样式设置的大部分属性,但您必须逐个属性地进行。
    【解决方案3】:

    我想更改这些 在styles.xml 中动态属性。

    你到底想改变什么?运行时应用的样式?

    我认为您可以在代码中使用

    TypedArray a =  context.obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)
    

    这里(在我看来)似乎

    1. AttributeSet set = null; 因为这是 XML inflater 所提供的。

    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 一定是使用我的 XML 为我的可样式化 MyWidget 完成的。

    我希望人们可以通过在 TypedArray 中搜索所需的属性来查找正确的索引,但这将是低效的,并且 TypedArray 看起来像是一种令人不快的装置来处理。我会用一根很长的棍子戳它!

    不要

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2021-11-25
      • 2015-09-25
      相关资源
      最近更新 更多