【问题标题】:setTheme works but only after loading theme from manifestsetTheme 有效,但仅在从清单加载主题后
【发布时间】:2015-05-19 16:51:44
【问题描述】:

我正在尝试在运行时设置我的 Activity 的主题,选择多个主题之一。我希望所选主题在 Activity 启动时立即显示。

在清单的<application> 部分中,我使用android:theme="@style/AppTheme" 设置了默认主题。然后在我的onCreate() 中,我使用setTheme(R.style.DarkAppTheme) 将主题设置为用户选择的主题(将DarkAppTheme 替换为选定的主题)。

根据研究,setTheme() 似乎应该在 onCreate()setContentView() 之前,我就是这样做的。

但是,尽管这可以在用户选择的主题中显示 Activity,但 Activity 首先加载看起来像默认主题的内容,然后在短暂延迟后加载正确的主题。

如果我直接在清单中设置用户选择的主题,它会立即加载,但当然这是硬编码的,我想根据共享偏好动态更改它。

如何避免可见的转换?我希望从一开始就显示用户选择的主题。

谢谢。

【问题讨论】:

  • 你找到解决办法了吗?

标签: android themes android-manifest


【解决方案1】:

Activity 首先加载看起来像默认主题的内容,然后在短暂延迟后加载正确的主题...如何避免可见的转换?

当您的应用首次从主屏幕上的图标启动时,Activity“进入/打开”窗口动画有两个部分:

  1. “出现深灰色矩形”动画。这是系统进程在启动应用程序时绘制的初始空白屏幕 (source)。它也被称为“主题预览”屏幕或“启动画面”。如果您的应用使用 Light 主题,它可以是白色的。
  2. '淡入(或圆形显示)视图布局'。这是您的视图布局的动画,出现在深灰色矩形的顶部。它发生在第 1 部分之后。

第 1 部分是您将其标识为“默认主题的外观”。您可以使用 Activity/App 样式中的以下项目禁用第一部分:

<item name="android:windowDisablePreview">true</item>

这将阻止“出现深灰色矩形”动画,并且只允许“显示视图布局”,从而避免可见的切换或闪烁。但有一些警告:

  1. 您必须确保您的 Activity 快速启动,因为在您的布局完全加载之前,不会有任何视觉动画反馈给用户。这就是主题预览默认开启的原因。
  2. 它会在上下文菜单上引起奇怪的错误:对于任何PopupWindow,“进入”动画将不再发生,它会立即显示(“退出”动画不受影响)。这也适用于系统 PopupWindows,如溢出菜单列表,以及 AutoCompleteTextView 的下拉列表。此错误发生在 Android 4/5/6 上,但不在 Android 7/8 上。更多信息here

windowDisablePreview的文档:

允许您禁用窗口启动画面的标志。默认值为假;如果设置为 true,则系统永远不会在您的实际实例显示给用户之前使用窗口的主题来显示初始屏幕预览。

更多信息:

【讨论】:

  • 我想使用预览窗口,但在用户选择主题时效果很好。
【解决方案2】:

AndroidManifest 上的主题只会在您的 Activity 加载时间过长时出现。您可以尝试调高Activity 负载并从AndroidManifest 中删除android:theme="@style/AppTheme",甚至可以在这两种用途之间进行折衷。

希望对你有帮助\o/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多