在我的应用中,我允许用户选择背景颜色,字体大小。选择这些后,这种新的背景颜色将适用于活动和应用程序中的每个视图。
那么如何更改此背景颜色以将其应用于活动中的所有视图?
我想将此作为应用程序主题属性实现。这意味着更改的颜色应该反映在应用程序启动时每个活动的视图中。
有一种简单的方法吗? 否则,我将不得不单独为每个视图设置背景颜色属性。
此问题的所有相关帖子都讨论了如何在已有主题之间进行更改。
答案 0 :(得分:0)
获得用户选择的背景颜色后,您可以将其保存在共享首选项中。然后,在每个活动的onCreate中,您可以接收共享偏好值并设置背景颜色。
设置背景颜色很简单:
view.setBackgroundColor(Color.GREEN);
使用共享偏好:
SharedPreferences sp = getSharedPreferences("color", MODE_PRIVATE);
String color = sp.getString("colorChoice", "BLACK");
上面的代码声明了一个类型为sharedpreferences的变量:“color”就像组一样。然后,声明一个调用sp.getString()的String变量:“BLACK”是默认值。
并保存到共享偏好:
Editor edit = sp.edit();
edit.putString("colorChoice", "Whatever the user selects here");
edit.commit();
当用户选择他们想要背景的颜色时,可以使用上述代码。
现在,如果您希望它对活动中的所有视图起作用,只需创建一个以视图作为参数的方法(然后您需要为每个视图调用此方法),或者使用视图组并调用其子视图。像这样的东西:
private void unbindDrawables(View view){
if (view.getBackground() != null){
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup){
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++){
unbindDrawables(((ViewGroup) view).getChildAt(i));
}//for loop
try {
((ViewGroup) view).removeAllViews();
} catch (UnsupportedOperationException e) {
e.printStackTrace();
}
}
请注意,此方法不会设置背景颜色。这只是使用viewgroup并递归调用每个视图的示例。上述方法用于清除视图,特别是位图。