【问题标题】:Android App : Apply Color Theme Dynamically at RuntimeAndroid 应用程序:在运行时动态应用颜色主题
【发布时间】:2014-03-20 10:11:58
【问题描述】:

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

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

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


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

【问题讨论】:

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


    【解决方案1】:

    您可以用特定颜色填充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 并根据您保存的值应用可绘制的颜色填充。然后,您需要做的就是将 XML 中的 <Button.../> 替换为您的自定义路径。

    这是一个带有ActionBar 图标的示例。

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

    【讨论】:

    • 这没有意义。您为背景图像创建可绘制对象,而不是文本颜色。除此之外,无论您是通过样式还是使用上述方法来创建可绘制对象,无论哪种方式。
    • 你错了。子类 TextViewButton。调用Button.setBackgroundDrawable 并根据您保存的值在构造函数中应用可绘制的颜色填充。然后根据相同的值在构造函数中调用TextView.setTextColor。现在您所要做的就是替换 XML。无论哪种方式,您都会创建 50-70 个视图。您不能将 one Drawable 应用于 50-70 次查看。无论您是通过样式还是通过代码,它们都有自己的特点。他们现在有 50-70 个,而你没有做任何事情。
    • 很抱歉不明白你想说什么,这是个好方法,我一直在关注创建自己的自定义按钮和文本视图并在 XML 中使用它们,但是使用这种方法时,需要制作时会出现问题一个不同颜色的按钮和其他不同的按钮也随着需求的变化我需要创建所有自定义视图而不是默认视图。您是否也在任何应用程序中实施了相同的方法?您在制作自定义视图并在开发过程中一直使用它们方面的经验如何?
    • 我编写了一个使用主题引擎的应用程序,该引擎允许人们创建自定义可绘制对象并将自定义颜色应用于应用程序。我要解释的是我在这个应用程序中使用的内容。此外,调用 maskBitmap = null Drawable.setColorFilter(null)Drawable.setCallback(null) 用于释放创建颜色填充可绘制对象时使用的任何引用。无论如何,这是我的两分钱。
    • 感谢您的支持 adneal +1,我还有一个问题说我有按钮的子类,并在屏幕的两个地方使用它说“取消”和“确定”,我想给不同的颜色根据他们的类型或标签,我应该如何实现?或者我需要创建两个不同的按钮子类?
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2012-03-30
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多