如何在使用程序化组件时使用正确的Android主题?

时间:2014-08-08 08:55:36

标签: android api themes

我正在使用Android Studio“New Project”中创建的默认基本应用。该应用程序正在使用Holo.Light.DarkActionBar主题,这样可以正常工作。然后我将主要活动onCreate()方法改为仅使用程序化组件(我有我的理由!),例如:

// setContentView(R.layout.activity_main); Removed!

// Added this:
setTheme(R.style.AppTheme);
RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.WRAP_CONTENT,
    RelativeLayout.LayoutParams.WRAP_CONTENT);
Button button = new Button(getApplicationContext());
button.setText("Test");
setContentView(button, lParams);

值/ styles.xml:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
</style>

的AndroidManifest.xml:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

但是,现在按钮出现在错误的主题中。它看起来像Holo Dark或其他东西,但颜色肯定是错误的。此外,EditText等其他组件也有错误的主题。操作栏和主背景主题似乎是正确的。

为了设置正确的主题,还有其他事情要做吗?

由于

1 个答案:

答案 0 :(得分:0)

以下是您可以使用多个主题的方法:

<强>值/ styles.xml:

<style name="AppTheme" parent="android:Theme.Holo.Light">
    <item name="search_icon">@drawable/ic_action_search_light</item>
    <item name="loading_panel_indicator">@style/LoadingPanelIndicator_Light</item>
    <item name="exp_group_selector">@drawable/exp_group_selection_light</item>
    <item name="list_selector">@drawable/list_selection_light</item>
    <item name="spinner_background">@drawable/spinner_bg_light</item>
</style>

<style name="AppDarkTheme" parent="android:Theme.Holo">
    <item name="search_icon">@drawable/ic_action_search</item>
    <item name="loading_panel_indicator">@style/LoadingPanelIndicator</item>
    <item name="exp_group_selector">@drawable/exp_group_selection</item>
    <item name="list_selector">@drawable/list_selection</item>
    <item name="spinner_background">@drawable/spinner_bg</item>
</style>

并在你的活动中onCreate:

    isThemeLight = prefs.getBoolean(PREF_LIGHT_THEME, true);
    if (!isThemeLight)
        setTheme(R.style.AppDarkTheme);

并且您的默认主题始终在清单中设置:

<application
    ...
    android:theme="@style/AppTheme">
    ...
</application>

更改主题后,必须重新创建活动。这是在更改主题后使用的一段代码(例如@ onRestart(),但它取决于您何时更改它):

boolean isLight = prefs.getBoolean(PREF_LIGHT_THEME, true);
// If theme changed re-create the activity
if (isThemeLight != isLight) {
    // Call the recreate in the UI thread
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            recreate();
        }
    }, 1);
    return;
}