setTheme只能在从manifest中加载主题后才能工作

时间:2015-05-19 16:51:44

标签: android themes android-manifest

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

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

基于研究,似乎setTheme()应该在onCreate()之前和setContentView()之前进行。

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

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

  

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

活动分为两部分&#39;进入/打开&#39;窗口动画,当您的应用首次启动时从主屏幕上的图标

Video screenshot of Android 7 Activity open window animation

  1. &#39;深灰色矩形显示&#39; 动画。这是系统进程在启动应用程序时绘制的初始空白屏幕(source)。它也被称为&#34;主题预览&#34;屏幕或&#34;闪屏&#34;。如果您的应用使用Light主题,则可以为白色。
  2. 视图布局的&#39;淡入(或循环显示)&#39; 。这是您的视图布局的动画出现在深灰色矩形的顶部。它发生在第1部分之后。
  3. 第1部分是您标识为&#34; 看起来像默认主题的内容&#34;。您可以使用活动/应用程序样式中的以下项禁用此第一部分:

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

    这样可以防止出现深灰色矩形&#39;动画,只允许显示视图布局&#39;因此避免可见的转换或闪烁。但有一些警告:

    1. 您必须确保您的Activity快速启动,因为在您的布局完全加载之前,用户将不会收到可视动画反馈。这就是为什么主题预览通常默认开启的原因。
    2. 它会导致上下文菜单出现奇怪的错误:对于任何PopupWindow,输入&#39;动画将不再发生,它将立即显示(&#39;退出&#39;动画不受影响)。这也适用于系统PopupWindows,如溢出菜单列表和AutoCompleteTextView的下拉列表。此错误发生在Android 4/5/6上,但不会发生在Android 7/8上。更多信息here
    3. windowDisablePreview的文档:

        

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

      更多信息:

答案 1 :(得分:0)

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

我希望它可以帮助你\ o /