1

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

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

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

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

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

4

1 回答 1

0

获得用户选择的背景颜色后,您可以将其保存在共享首选项中。然后,在每个活动的 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();
        }
    }

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

于 2012-11-02T23:15:16.967 回答