2017-02-14 72 views
0

一直试图找出一年现在。很久以前就有了一个临时的解决方法,但是当我准备在已开发的应用程序中添加新功能时,问题又回来了。如何在android应用程序中动态设置背景颜色?

主要目标:让用户能够选择几乎任何颜色作为应用程序的背景。

当前迭代:我有2个可绘制的图像,一个绿色,一个蓝色。用户能够在两者之间切换,但只能通过:

if (bgColor) { 
     getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.custom_blue_background_simple)); 
    } 
    else { 
     getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.custom_green_background)); 
    } 
} 

博客上,如果用户更改默认从绿色的背景下,以蓝色布尔。

现在,我想切换到的颜色,而不是可绘,我曾尝试:

LayoutInflater layInflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = layInflate.inflate(R.layout.main_activity_layout, null); 
    mainLayout = (RelativeLayout) view.findViewById(R.id.mainActivityRelativeLayoutId); 
    mainLayout.setBackgroundResource(R.color.colorRed); 

,但它不会做任何事情!

因此,然后我尝试像使用可绘制图像一样使用它,但颜色(类型int)不是类型可绘制的!所以这段代码也不起作用。

困境和问题:我有一个颜色选择器设置/偏好。用户可以从中挑选任何颜色,并将其保存为int类型的颜色。 它成功地接受文本颜色:

textView.setTextColor(colorPickerColor); 

colorPickerColor是从颜色选择器优先检索int类型的变量

但是,试图用它来改变布局或意见的背景时,它什么都不做。即使设置常量/硬编码颜色也不会改变颜色(如上面的代码所示)。我用颜色改变背景的唯一方法是用户可绘制(现在为我工作,但效率非常低,因为我必须为每种可选颜色提供单独的可绘图,可能为数百或数十亿),或者颜色的十六进制代码,但硬编码到布局的XML中,因为将它放在代码中什么也不做(因为用户将无法选择,所以不会有用)。

什么是正确的方式来改变一个布局的背景颜色通过指定一个类型为int的颜色以编程方式/动态通过代码?我的应用程序支持的最小API是14

注意:我搜索了,但是出现的每个结果都没有关联,或者没有工作。

+1

你尝试过'view.setBackgroundColor(int color)'吗?用法示例:'mainLayout.setBackgroundColor(0xFF000000);' – Isaac

+0

@Isaac正确。记住领先的FF,因此它完全不透明。 –

+0

@isaac这不会做任何事情。这不就是我在做什么吗? –

回答

0

ColorDrawable将是您的案例的解决方案。假设colorPickerColor是一个整数颜色代码绘制,背景可以用下面的代码设置:

mainLayout.setBackgroundDrawable(new ColorDrawable(colorPickerColor)); 

如果colorPickerColor是彩色资源ID,

mainLayout.setBackgroundDrawable(new ColorDrawable(getResources().getColor(colorPickerColor))); 

请注意,setBackgroundDrawable方法已被弃用,您可以调用setBackground来代替。

+0

使用新的ColorDrawable()方法可行,但不是如何张贴。我必须使用它与我在做可绘制图像的方式相同: getWindow()。setBackgroundDrawable(new ColorDrawable(bgColorPicker)); 这是可以接受的使用,或者是不好的形式? –

+0

@AeonPsych,没有什么好或坏的,这只是取决于你的情况。例如,如果您只想让用户选择一种颜色并应用于应用程序的每个活动,则可以在基本活动中将getWindow()设置为getWindow(),并且所有活动均可扩展到此。如果你想要更多的灵活性,例如,你可能在Activity中导航了多个片段,那么你可以在片段的mainLayout中设置它(例如可能是布局的根元素),这样做,你的应用可以有不同的颜色在不同的屏幕上。 – CodePlay

+0

很奇怪,因为我无法改变布局的颜色。 mainLayout.setBackgroundDrawable(new ColorDrawable(colorPickerColor)); 不适合我lol。 出于某种原因,它只适用于当我更改getWindow() –