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

4
我正在尝试解决如何组织一个具有多个主题的Android应用程序的问题。以下是我的问题的简化示例,
有两个主题:“浅色”和“深色”, 在每个主题中,有两种文本颜色:“启用”和“禁用”
现在的问题是,当我定义我的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. 定义一个属性引用,比如说“enabled”
3. 定义一个样式(主题)项,如 @style/light.enabled
4. 使用属性来定义视图中的样式
这就是我想要的,但对我不起作用。唯一的区别是我正在使用一个小部件。作者在活动上设置主题。我可以设置它的地方是Context.setTheme()和manifest中的“application”标签。似乎都没有什么区别。

我找到了一些类似这个网页的页面,http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html,它们暗示你可以从一个项目中引用其他样式,但是编辑器会抱怨,因为它希望项目名称是一个明确定义的Android属性(例如,android:textColor)。 - Jeffrey Blattman
3个回答

0

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

  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


这是关于一个活动的。我在询问有关应用程序小部件的事情。 - Jeffrey Blattman

0

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

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


如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含链接到此问题。- 来自审核 - Abhishek Dutt

0

你不能将主题应用于应用程序小部件。 你需要有不同的 XML 文件,使用不同的样式。

另外,当你谈论浅色和深色以及启用与禁用时,容易混淆它们是相似的东西。 它们在平台上非常不同。

  • 浅色和深色实际上是平台定义的“主题”,是一组默认的资源属性值,源于 android:style/Theme。 可以通过在清单中使用 android:theme 或在 API 中使用 setTheme() 来更改这些值。

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

例如,这里有一个基于状态改变的颜色:
https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/color/primary_text_dark.xml

这是一个根据状态改变的可绘制对象: https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/drawable/btn_default.xml

好的,请使用“标签”(文本颜色)和“值”(文本颜色),如果有帮助的话。我的意思是尝试给出一个抽象的例子,而不是实际表示启用和禁用。 - Jeffrey Blattman

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