在我的应用程序中,我允许用户选择背景颜色、字体大小。一旦选择了这些,这个新的背景颜色将适用于活动和应用程序中的每个视图。
那么如何更改此背景颜色以将其应用于活动中的所有视图?
我想将其作为应用程序主题属性来实现。这意味着每当我的应用程序启动时,更改的颜色都应该反映在我的应用程序的每个活动的视图上。
有没有一种简单的方法可以做到这一点?否则,我将不得不为每个视图单独设置背景颜色属性。
此问题的所有相关帖子都讨论了在预先存在的主题之间进行的更改。
在我的应用程序中,我允许用户选择背景颜色、字体大小。一旦选择了这些,这个新的背景颜色将适用于活动和应用程序中的每个视图。
那么如何更改此背景颜色以将其应用于活动中的所有视图?
我想将其作为应用程序主题属性来实现。这意味着每当我的应用程序启动时,更改的颜色都应该反映在我的应用程序的每个活动的视图上。
有没有一种简单的方法可以做到这一点?否则,我将不得不为每个视图单独设置背景颜色属性。
此问题的所有相关帖子都讨论了在预先存在的主题之间进行的更改。
获得用户选择的背景颜色后,您可以将其保存在共享首选项中。然后,在每个活动的 onCreate 中,您可以接收 sharedpreference 值并设置背景颜色。
设置背景颜色很简单:
view.setBackgroundColor(Color.GREEN);
使用共享首选项:
SharedPreferences sp = getSharedPreferences("color", MODE_PRIVATE);
String color = sp.getString("colorChoice", "BLACK");
上面的代码声明了一个 sharedpreferences 类型的变量:“color”就像组一样。然后,您声明一个调用 sp.getString() 的字符串变量:“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();
}
}
请注意,此方法不设置背景颜色。这只是使用视图组并递归调用每个视图的示例。上述方法用于清除视图,特别是位图。