我在一个地方设置了getBackground().setAlpha(0);在别的activity中有些控件也变成透明的了,让我百思不得其解,哦,现在是晚上十一点四十五,问题终于解决(解决不了睡不着觉啊),觉得挺有意思的,分享一下,先举个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:orientation=
"vertical"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<TextView
android:id=
"@+id/text1"
android:layout_width=
"match_parent"
android:layout_height=
"60dp"
android:background=
"@color/text_orange"
/>
<TextView
android:id=
"@+id/text2"
android:layout_width=
"match_parent"
android:layout_height=
"60dp"
android:background=
"@color/text_orange"
/>
</LinearLayout>
|
两个textview,background都指向相同的资源,那如果text1.getBackground().setAlpha(255)(不透明),那text2的背景是不是也跟着变成不透明的呢,答案是yes,那为什么呢:默认情况下,所有的从同一资源(R.drawable.***等等)加载的实例都共享一个共用的状态,如果你更改一个实例的状态,其余的实例都会接收到相同的通知。
那怎么解决这种情况呢,看看这个方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* Make this drawable mutable. This operation cannot be reversed. A mutable
* drawable is guaranteed to not share its state with any other drawable.
* This is especially useful when you need to modify properties of drawables
* loaded from resources. By default, all drawables instances loaded from
* the same resource share a common state; if you modify the state of one
* instance, all the other instances will receive the same modification.
*
* Calling this method on a mutable Drawable will have no effect.
*
* @return This drawable.
* @see ConstantState
* @see #getConstantState()
*/
public
Drawable mutate() {
return
this
;
}
|
翻译一下注释吧:让这个drawable可变,这个操作是不可逆的。一个可变Drawable可以保证不与其它的Drawable分享一个状态。当你需要修改资源中的Drawable的属性时这个方法是非常有用的,因为默认情况下加载相同资源的所有Drawable实例拥有同一个状态,如果你在一个地方改变了状态,其它的实例也会跟着改变。
OK。所以
1
|
text1.getBackground().mutate().setAlpha(
255
);
|
就完美解决了。
原文地址
http://my.oschina.net/gef/blog/609289