我正在使用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等其他组件也有错误的主题。操作栏和主背景主题似乎是正确的。
为了设置正确的主题,还有其他事情要做吗?
由于
答案 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;
}