dor*_*ors 16 android view colors setbackground
我正在构建一个拥有大量屏幕的应用程序.大多数屏幕顶部都有一个带有背景颜色的View.
我经常使用view.setBackgroundColor(color)更改颜色
这是奇怪的事情:有时在设置一个视图的颜色后,对#f14fb7说,当在应用程序中导航时,其他视图的背景设置为该颜色而我不想要它们.它有时甚至发生在我没有为其设置id的视图中,因此在这些视图上无法调用setBackgroundColor.
这很少发生,并且不符合我尝试过的任何流程.
当我杀死应用程序并重新启动它时,一切正常.
我唯一的猜测是内存泄漏之王,但我希望有一个更简单的解释.
谁能想到这种情况发生的原因?
*它发生在我的Galaxy S3上.
ben*_*n75 13
没有代码就不容易......但是我猜你ColorDrawable在多个视图上重复使用它们,如果你看一下View.setBackgroundColor()源代码:
public void setBackgroundColor(int color) {
if (mBGDrawable instanceof ColorDrawable) {
((ColorDrawable) mBGDrawable).setColor(color);
} else {
setBackgroundDrawable(new ColorDrawable(color));
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到它改变了颜色,ColorDrawable并且每次都不创建新颜色.我很确定这就是你有这种奇怪行为的原因.
编辑
当您使用xml设置初始背景颜色时android:background(根据Android doc):
将背景设置为给定资源.资源应该引用Drawable对象
根据我的理解,它将View.mBGDrawable在膨胀期间设置场地.我建议你用View.setBackgoundDrawable(new ColorDrawable(the_color_int_code)))而不是setBackgroung(the_color_int_code).它应该解决你的问题.
如果您的视图的颜色在xml ex中设置,通常会发生这种情况:
android:background="@color/cyan"
Run Code Online (Sandbox Code Playgroud)
现在,这内部创建了一个新的ColorDrawable- 让我们conceptual_drawable_cyan在该视图的类中调用它.现在,当使用以下编程方式为同一视图分配不同的颜色时:
view.setBackgroundColor(newColor);
Run Code Online (Sandbox Code Playgroud)
内部这种观点,而不是创建一个不同的绘制它设置这个newColor来drawable_cyan.因此,从这一点开始,如果您在任何地方使用
android:background="@color/cyan"
Run Code Online (Sandbox Code Playgroud)
视图实际上使用conceptual_drawable_cyan与newColor.
解:
而不是使用setBackgroundColor以编程方式设置颜色,使用:
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(new ColorDrawable(newColor));
} else {
view.setBackgroundDrawable(new ColorDrawable(newColor));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3111 次 |
| 最近记录: |