在运行时使用 setTheme() 只会更改文本颜色



我正在尝试为我的应用程序实现一个深色主题。用户可以在选项菜单中轻松在正常和黑暗之间切换 - 这工作正常。但是当主题在运行时更改时,只有文本颜色会发生变化,我不知道为什么。

我的黑暗主题风格.xml:

<style name="Dark" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/dark_background</item>
<item name="colorPrimaryDark">@color/dark_top</item>
<item name="colorAccent">@color/dark_button</item>
<item name="colorButtonNormal">@color/dark_button</item>
<item name="android:colorBackground">@color/dark_background</item>
<item name="android:itemBackground">@color/dark_background</item>
<item name="android:textColor">@color/white</item>
<item name="android:textColorHint">#EAEAEA</item>
<item name="android:textColorPrimary">@color/white</item>
<item name="android:textColorSecondary">@color/white</item>
<item name="android:textColorTertiary">@color/white</item>
</style>

我的设置样式的方式:

setTheme(R.style.Dark);

更改主题之前: 以前

更改主题后: 后

我真的不知道为什么。是因为NavigationView吗?

确保在setContentView()或膨胀视图之前调用setTheme()。 根据文档,在上下文中实例化任何视图之前,您必须使用setTheme()。 使用recreate()创建活动的新实例,以便您可以在onCreate()方法中应用更改的主题。

如果您四处搜索一下,您可以找到几个主题切换的示例。 这是一个这样的示例的链接: https://gist.github.com/alphamu/f2469c28e17b24114fe5

我使用PreferenceManager来存储这样的设置,以便在我有多个活动需要使用该设置时轻松访问。 除非您已经有更好的方法来存储用户的主题选择,否则我建议您使用以下示例。

"我的应用首选项"类示例:

public class MyAppPreferences {
private static SharedPreferences getPrefs(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context);
}
public static int getThemeId(Context context, int defaultThemeId) {
return getPrefs(context).getInt("CurrentThemeId", defaultThemeId);
}
public static void setThemeId(Context context, int value) {
getPrefs(context).edit().putInt("CurrentThemeId", value).commit();
}
}

使用 MyAppPreferences 类的示例活动类:

public class MyActivity extends AppCompatActivity implements OnClickListener {
private Button btnDark;
private Button btnLight;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);            
// Set the theme
// If there is nothing set, the light theme will be used by default
setTheme(MyAppPreferences.getThemeId(this, R.style.Light));
setContentView(R.layout.myLayout);
btnDark = (Button) this.findViewById(R.id.viewbtnDark);
btnDark.setOnClickListener(this);
btnLight = (Button) this.findViewById(R.id.viewbtnLight);
btnLight.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// 1. Set the theme preference
// 2. Recreate the activity to "apply" the theme
if (v.equals(btnDark)) {
MyAppPreferences.setThemeId(this, R.style.Dark);
this.recreate();
} else if (v.equals(btnLight)) {
MyAppPreferences.setThemeId(this, R.style.Light);
this.recreate();
}
}
}

您的示例主题不显示窗口操作栏或窗口无标题设置,因此如果您碰巧使用默认主题,并且未在深色主题中以相同的方式设置这些选项,则仍可能遇到崩溃。 检查 Logcat 是否存在如下错误:java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor.

深色主题示例

<style name="Dark" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/dark_background</item>
<item name="colorPrimaryDark">@color/dark_top</item>
<item name="colorAccent">@color/dark_button</item>
<item name="colorButtonNormal">@color/dark_button</item>
<item name="android:colorBackground">@color/dark_background</item>
<item name="android:itemBackground">@color/dark_background</item>
<item name="android:textColor">@color/white</item>
<item name="android:textColorHint">#EAEAEA</item>
<item name="android:textColorPrimary">@color/white</item>
<item name="android:textColorSecondary">@color/white</item>
<item name="android:textColorTertiary">@color/white</item>
</style>

相关内容

  • 没有找到相关文章

最新更新