Android应用程序:在运行时动态应用颜色主题

时间:2014-03-20 10:11:59

标签: android android-layout android-theme android-styles

在我的应用程序中我想支持这样的功能,用户可以从列表中选择颜色(从WebService下载),并且当用户选择任何颜色(比如橙色)时,我的应用程序中的所有按钮都将背景颜色设置为橙色。

我已经检查了http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html之类的解决方案,但是我需要在我的应用中使用不同的颜色创建不同的样式。

我的需求是我只支持一种风格,只需要根据选择更改背景颜色,因此我不想在运行时获取所有按钮并应用该颜色。


因此,请建议任何其他更好的解决方案,将所选颜色应用于应用程序中的所有按钮,而无需获取活动中的所有按钮并设置其背景颜色。

1 个答案:

答案 0 :(得分:2)

您可以使用特定颜色填充Bitmap

private BitmapDrawable makeColorFillDrawable(int color, Drawable d) {
    Bitmap maskBitmap = ((BitmapDrawable) d).getBitmap();
    final int width = maskBitmap.getWidth();
    final int height = maskBitmap.getHeight();
    maskBitmap = null;

    final Bitmap outBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(outBitmap);
    d.setBounds(0, 0, width, height);
    d.setColorFilter(color, PorterDuff.Mode.SRC_IN);
    d.draw(canvas);
    d.setColorFilter(null);
    d.setCallback(null);

    return new BitmapDrawable(getResources(), outBitmap);
}

SharedPreferences中保存从服务器获取的颜色。然后子类Button并根据您保存的值应用颜色填充drawable。您需要做的就是将XML中的<Button.../>替换为自定义路径。

以下是ActionBar图标的示例。

    final Drawable d = getResources().getDrawable(android.R.drawable.sym_def_app_icon);
    getActionBar().setIcon(makeColorFillDrawable(Color.RED, d));

Example