如何在android中以编程方式编辑应用程序主题的属性

如何在android中以编程方式编辑应用程序主题的属性,android,android-layout,Android,Android Layout,在我的应用程序中,我允许用户选择背景颜色、字体大小。选择这些选项后,此新背景色将适用于“活动”和“应用程序”中的每个视图 那么,如何更改此背景色以将其应用于“活动”中的所有视图 我想实现这一点作为应用程序主题属性。这意味着无论何时启动我的应用程序,更改后的颜色都应该反映在每个活动的视图上 有没有一个简单的方法可以做到这一点? 否则,我将不得不为每个视图分别设置背景色属性 与此问题相关的所有帖子都讨论了如何在预先存在的主题之间进行更改。一旦获得用户选择的背景颜色,就可以将其保存在共享参考中。然后,

在我的应用程序中,我允许用户选择背景颜色、字体大小。选择这些选项后,此新背景色将适用于“活动”和“应用程序”中的每个视图

那么,如何更改此背景色以将其应用于“活动”中的所有视图

我想实现这一点作为应用程序主题属性。这意味着无论何时启动我的应用程序,更改后的颜色都应该反映在每个活动的视图上

有没有一个简单的方法可以做到这一点? 否则,我将不得不为每个视图分别设置背景色属性


与此问题相关的所有帖子都讨论了如何在预先存在的主题之间进行更改。

一旦获得用户选择的背景颜色,就可以将其保存在共享参考中。然后,在每个活动的onCreate中,您可以接收SharedReference值并设置背景色

设置背景色很简单:

view.setBackgroundColor(Color.GREEN);
要使用SharedReference,请执行以下操作:

SharedPreferences sp = getSharedPreferences("color", MODE_PRIVATE);

String color = sp.getString("colorChoice", "BLACK");
Editor edit = sp.edit();
edit.putString("colorChoice", "Whatever the user selects here");
edit.commit();
上面的代码声明了SharedReferences类型的变量:“color”类似于组。然后,声明一个调用sp.getString()的字符串变量:“BLACK”是默认值

要保存到SharedReferences,请执行以下操作:

SharedPreferences sp = getSharedPreferences("color", MODE_PRIVATE);

String color = sp.getString("colorChoice", "BLACK");
Editor edit = sp.edit();
edit.putString("colorChoice", "Whatever the user selects here");
edit.commit();
当用户选择他们想要的背景颜色时,可以使用上面的代码

现在,如果您希望它适用于活动中的所有视图,只需创建一个方法,该方法要么以view作为参数(然后需要为每个视图调用此方法),要么使用viewgroup并调用其子对象。大概是这样的:

    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();
        }
    }
private void unbindDrawable(视图){
if(view.getBackground()!=null){
view.getBackground().setCallback(null);
}
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
未绑定的Drawables(((视图组)视图).getChildAt(i));
}//for循环
试一试{
((视图组)视图);
}捕获(不支持操作异常e){
e、 printStackTrace();
}
}

注意:此方法不设置背景色。这只是使用viewgroup并递归调用每个视图的一个示例。上述方法用于清除视图,特别是位图的视图。

目前,我正在执行相同的操作,即在SharedReferences中设置值,在onCreate中检索值并进行设置。但正如我前面提到的,这必须对所有具有代表性的视图执行。因此,我只需要一种方法来减少这项工作。