提供多个Android应用程序主题的最佳实践

时间:2010-10-23 06:09:36

标签: android coding-style themes

我正在尝试研究如何组织一个具有多个主题的Android应用程序。这是我的问题的简化示例,

2个主题,“光明”和“黑暗”,
在每个主题中,有两种文字颜色:“启用”和“禁用”

现在的问题是,当我定义我的TextView时,我不想在那里调出“光”或“暗”,我想在应用程序级别指定主题并应用它。基本上,我想要CSS选择器。我希望能够定义我的主题,

<style name="Light.enabled" .../>
<style name="Light.disabled" .../>

和我的文字视图一样,

<TextView style="@style/.enabled" .../>
<TextView style="@style/.disabled" .../>

并根据我是否在应用程序级别调出“亮”或“暗”来应用“启用”或“禁用”。

这个页面, http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

显示

的应用
  1. 定义一种风格,比如说“light.enabled”

      #000000

  2. 定义属性引用,例如“enabled”

  3. 定义样式(主题)项目,如

      @风格/ light.enabled

  4. 使用attr在视图中定义样式

  5. 这就是我想要的,但它对我不起作用。唯一的区别是我正在使用appwidget。作者设定了活动的主题。我可以设置它的唯一地方是Context.setTheme(),以及清单中的“application”标签。这两者似乎都没有区别。

3 个答案:

答案 0 :(得分:3)

我找到了这个页面, http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

给出了动态应用多个主题的绝佳示例。我似乎无法使用app小部件,但这是一个不同的问题。

答案 1 :(得分:0)

您无法将主题应用于应用小部件。您只需要使用不同的XML来使用不同的样式。

此外,当你谈论光与暗,启用与禁用相似时,它会让人感到困惑。它们在平台上非常不同。

  • 光明与黑暗是平台定义的实际“主题”,它是资源属性的一组默认值,源于android:style / Theme。这些在清单中的android:theme或API中的setTheme()中更改。

  • 启用和禁用状态。它们与StateListDrawable(通过drawable /中的标签)或ColorStateList(通过颜色/中的标签)一起使用,以根据启用状态选择可绘制/颜色。

例如,这里的颜色会根据状态而变化:
https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/color/primary_text_dark.xml

这是一个基于状态改变的drawable:
https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/drawable/btn_default.xml

答案 2 :(得分:0)

如果您正在尝试在应用程序中支持多个主题。

  1. 在values / styles.xml中定义主题

    <style name="AppTheme" parent="Theme.AppCompat.Light">
    

    @绘制/ ic_mode_comment_white_24dp

    ... @绘制/ ic_subject_black_24dp

  2. 在colors.xml中定义颜色

  3. <resources> <color name="colorPrimary">#FF9800</color> </resources>

    1. 在活动运行时中切换主题

      public abstract class BaseActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { if (PreferenceManager.getDefaultSharedPreferences(this) .getBoolean("pref_dark_theme"), false)) { setTheme(R.style.AppTheme_Dark); } super.onCreate(savedInstanceState); } }

    2. 按照这篇文章part1part2

      进行操作