主题,背景颜色和操作栏的交互

时间:2013-04-25 01:42:34

标签: java android colors themes

我无法理解动作栏外观与主题化之间的互动模式。我的应用程序设置为使用默认主题,我认为它是黑暗的:

<style name="AppBaseTheme" parent="android:Theme">
</style>

通过应用程序范围的样式从应用程序中删除操作栏会导致主要活动的黑色背景:

    <activity
        android:name="com.atlarge.motionlog.MainActivity"
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    >

如果没有android:theme="@android:style/Theme.NoTitleBar.Fullscreen"行,则活动背景为白色。如果在活动的onCreate()方法中的代码中删除了操作栏,则操作栏也会消失,但背景仍为白色:

    ActionBar actionBar = getActionBar();
    actionBar.hide();       

TL; DR:行为摘要:

  • 操作栏:白色背景
  • 通过代码删除操作栏:白色背景
  • 通过XML删除操作栏:黑色背景

为什么?有人可以通过代码与XML和背景颜色来解释(或指向一个好的资源)关于动作栏外观的交互吗?

1 个答案:

答案 0 :(得分:2)

删除onCreate中的操作栏只是隐藏ActionBar视图。 它没有改变主题。

设置android:theme="@android:style/Theme.NoTitleBar.Fullscreen"正在为您的活动设置一个主题,该主题随该主题层次结构中的任何继承样式一起提供。

如果您查看Android源代码中的themes.xml,您会在样式<style name="Theme">中看到项目<item name="colorBackground">@android:color/background_dark</item>

然后<style name="Theme.NoTitleBar">继承了Theme的所有样式集<item name="android:windowNoTitle">true</item>

然后<style name="Theme.NoTitleBar.Fullscreen">继承自NoTitleBarTheme设置<item name="android:windowFullscreen">true</item><item name="android:windowContentOverlay">@null</item>

这解释了为什么在应用该样式时你有一个黑暗的背景。

如果您将主题设置为Theme.Light.NoTitleBar.Fullscreen,您将获得相同的效果,但您会从<item name="colorBackground">@android:color/background_light</item>继承<style name="Theme.Light">,这应该是浅色。

或者,您可以扩展任何所需的内容并覆盖任何样式。

所以,例如,你可以做一些像......

<style name="MyTheme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
    <item name="colorBackground">@color/my_light_color</item>
    <item name="windowBackground">@drawable/screen_background_selector_light</item>
</style>

以下是一些可能有助于您更多地了解主题的资源: http://developer.android.com/guide/topics/ui/themes.html http://brainflush.wordpress.com/2009/03/15/understanding-android-themes-and-styles/

如果你想创建或扩展你自己的主题,它总是值得查看android源代码,看看你可以扩展和覆盖: http://developer.android.com/guide/topics/ui/themes.html#PlatformStyles

希望有所帮助。