【问题标题】:Best practice for providing multiple Android application themes提供多个 Android 应用程序主题的最佳实践
【发布时间】:2010-10-23 06:09:36
【问题描述】:

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

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

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

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

和我的文本视图一样,

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

并根据我在应用程序级别调用“light”还是“dark”来应用“启用”或“禁用”。

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

显示一个应用程序

  1. 定义一种风格,比如“light.enabled”

    #000000

  2. 定义一个属性引用,比如“启用”

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

    @style/light.enabled

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

这是我想要的,但它对我不起作用。唯一的区别是我正在使用一个 appwidget。作者设定了活动的主题。我唯一可以设置它的地方是 Context.setTheme(),并且在清单中的“应用程序”标记处。这两者似乎都没有什么不同。

【问题讨论】:

  • 我发现了一些页面,例如这个,androidengineer.com/2010/06/…,这意味着您可以从一个项目中引用其他样式,但编辑器抱怨它希望项目名称是一个定义明确的 android属性(例如,android:textColor)。

标签: android themes


【解决方案1】:

您不能将主题应用到应用小部件。您只需要使用不同样式的不同 XML。

此外,当您将浅色与深色以及启用与禁用作为类似事物进行讨论时,会令人困惑。它们在平台上非常不同。

  • Light 和 Dark 是平台定义的实际“主题”,它是资源属性的一组默认值,源于 android:style/Theme。这些通过清单中的 android:theme 或 API 中的 setTheme() 进行更改。

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

例如,这里的颜色会根据状态而变化:
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】:

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

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

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

    @drawable/ic_mode_comment_white_24dp

    ... @drawable/ic_subject_black_24dp

  2. 在 colors.xml 中定义颜色

<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); } }

关注这篇文章part1part2

【讨论】:

  • 那是一个活动。我在问应用小部件。
【解决方案3】:

我向 Android 应用程序添加了更多主题。但仅适用于 if-else 语句。

我的代码:

if (sharedPreferences.getString("color_option", "Blue").equals("Blue")) {
   setTheme(R.style.RedTheme);
} else  {
   setTheme(R.style.BlueTheme);
}

下一步

if (sharedPreferences.getString("color_option", "Blue").equals("Blue")) {
   setTheme(R.style.RedTheme);
} else if(sharedPreferences.getString("color_option", "Blue").equals("Blue")) {
   setTheme(R.style.BlueTheme);
} else {
   setTheme(R.style.HTheme);
}

两个代码都不起作用只选择了两个主题没有选择第三个主题(不工作)。我添加了多个或更多主题。

【讨论】:

  • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多