Android: 动态改变应用主题
Android: Change application theme dynamically
这是我应用程序的实际 style.xml:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:alertDialogTheme">@style/customDialog</item>
<item name="android:actionBarStyle">@style/customActionBar</item>
</style>
<style name="LoginStyle" parent="AppTheme.Base">
<item name="colorPrimaryDark">@color/Material_Blue</item>
<item name="colorControlNormal">#c5c5c5</item>
<item name="colorControlActivated">#FFFFFF</item>
<item name="colorControlHighlight">#FFFFFF</item>
</style>
<style name="MainStyle" parent="AppTheme.Base">
<item name="android:actionBarTheme">@style/customActionBar</item>
<item name="android:colorAccent">@color/md_material_blue_600</item>
<item name="colorPrimaryDark">@color/Material_Blue</item>
<item name="colorControlNormal">@color/md_material_blue_600</item>
<item name="colorControlActivated">@color/md_material_blue_600</item>
<item name="colorControlHighlight">@color/md_material_blue_600</item>
</style>
<style name="customDialog">
<item name="android:windowIsFloating">true</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
<item name="colorControlActivated">@color/md_material_blue_600</item>
<item name="android:colorControlHighlight">@color/md_material_blue_600</item>
<item name="android:button">@color/md_material_blue_600</item>
</style>
<style name="customActionBar">
<item name="android:background">@color/Material_Blue</item>
</style>
如您所见,我的应用程序有一些不同的主题,但现在一些用户要求我实现一个可以将 "light theme" 切换为 "dark theme" 的功能。现在,如果我将 AppTheme.Base
的主题父级更改为 Theme.AppCompat
,整个应用程序将获得 "dark theme".
那么,有没有办法改变基础主题的父主题?或者我需要做什么才能得到我的结果?
我读过这个:,我已经实现了那些 类 但它只将文本颜色更改为白色,没有其他任何改变。(当然我已经创建了另一种样式xml; 本质上,我复制粘贴了原始主题,然后将 AppTheme.Base
父级更改为 Theme.AppCompat
)
谢谢。
为此上下文设置基本主题。请注意,这应该在上下文中实例化任何视图之前调用(例如,在调用 setContentView(View) 或 inflate(int, ViewGroup) 之前)。
check http://developer.android.com/reference/android/content/Context.html#setTheme%28int%29
public void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
这是我应用程序的实际 style.xml:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:alertDialogTheme">@style/customDialog</item>
<item name="android:actionBarStyle">@style/customActionBar</item>
</style>
<style name="LoginStyle" parent="AppTheme.Base">
<item name="colorPrimaryDark">@color/Material_Blue</item>
<item name="colorControlNormal">#c5c5c5</item>
<item name="colorControlActivated">#FFFFFF</item>
<item name="colorControlHighlight">#FFFFFF</item>
</style>
<style name="MainStyle" parent="AppTheme.Base">
<item name="android:actionBarTheme">@style/customActionBar</item>
<item name="android:colorAccent">@color/md_material_blue_600</item>
<item name="colorPrimaryDark">@color/Material_Blue</item>
<item name="colorControlNormal">@color/md_material_blue_600</item>
<item name="colorControlActivated">@color/md_material_blue_600</item>
<item name="colorControlHighlight">@color/md_material_blue_600</item>
</style>
<style name="customDialog">
<item name="android:windowIsFloating">true</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
<item name="colorControlActivated">@color/md_material_blue_600</item>
<item name="android:colorControlHighlight">@color/md_material_blue_600</item>
<item name="android:button">@color/md_material_blue_600</item>
</style>
<style name="customActionBar">
<item name="android:background">@color/Material_Blue</item>
</style>
如您所见,我的应用程序有一些不同的主题,但现在一些用户要求我实现一个可以将 "light theme" 切换为 "dark theme" 的功能。现在,如果我将 AppTheme.Base
的主题父级更改为 Theme.AppCompat
,整个应用程序将获得 "dark theme".
那么,有没有办法改变基础主题的父主题?或者我需要做什么才能得到我的结果?
我读过这个:,我已经实现了那些 类 但它只将文本颜色更改为白色,没有其他任何改变。(当然我已经创建了另一种样式xml; 本质上,我复制粘贴了原始主题,然后将 AppTheme.Base
父级更改为 Theme.AppCompat
)
谢谢。
为此上下文设置基本主题。请注意,这应该在上下文中实例化任何视图之前调用(例如,在调用 setContentView(View) 或 inflate(int, ViewGroup) 之前)。
check http://developer.android.com/reference/android/content/Context.html#setTheme%28int%29
public void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}