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

时间:2012-11-02 20:56:33

标签: android android-layout

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

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

我想将此作为应用程序主题属性实现。这意味着更改的颜色应该反映在应用程序启动时每个活动的视图中。

有一种简单的方法吗? 否则,我将不得不单独为每个视图设置背景颜色属性。

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

1 个答案:

答案 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并递归调用每个视图的示例。上述方法用于清除视图,特别是位图。

相关问题