改变的 GradientDrawable 在不同的地方被不必要地重用
Altered GradientDrawable gets unwantedly reused in different places
我有一个 ShapeDrawable drawable/my_shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#FFFF00" />
<padding android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
</shape>
我在我的应用程序的几个地方用作某些 TextView
的背景。就像 layout/my_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout...>
<TextView
android:id="@+id/tag"
android:background="@drawable/my_drawable"
android:layout_height="wrap_content"
android:layout_width="wrap"
android:text="Some text"
/>
<!-- other tags -->
</RelativeLayout>
或在用作列表项的布局中 layout/my_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout...>
<TextView
android:id="@+id/subject"
android:background="@drawable/my_drawable"
android:layout_height="wrap_content"
android:layout_width="wrap"
/>
<!-- other tags -->
</RelativeLayout>
现在,当我以编程方式更改列表 ArrayAdapter
中形状的颜色时,片段中 TextView
的背景位于 中完全不同的位置我的应用 获得了与列表中最后一项相同的颜色!从那时起,具有更改颜色的形状将用于布局中具有 my_fragment.xml 的所有其他活动。
holder.subject = (TextView) v.findViewById(R.id.subject);
GradientDrawable bgShape = (GradientDrawable)holder.subject.getBackground();
bgShape.setColor( position % 2 == 0 ? Color.BLACK : Color.WHITE );
这怎么可能,我怎样才能避免这种 "reuse" 行为?
这是我的数组适配器的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder; // to reference the child views for later actions
if (v == null) {
LayoutInflater vi =
(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.my_list_item, null);
// cache view fields into the holder
holder = new ViewHolder();
holder.subject = (TextView) v.findViewById(R.id.subject);
// associate the holder with the view for later lookup
v.setTag(holder);
}
else {
// view already exists, get the holder instance from the view
holder = (ViewHolder) v.getTag();
}
GradientDrawable bgShape = (GradientDrawable)holder.subject.getBackground();
bgShape.setColor( position % 2 == 0 ? Color.BLACK : Color.WHITE );
holder.subject.setText(getItem(position));
}
// somewhere else in your class definition
static class ViewHolder {
TextView subject;
}
我必须使用 bgShape.mutate().setColor(..)
另见
- Android: Cloning a drawable in order to make a StateListDrawable with filters
- http://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate%28%29
我有一个 ShapeDrawable drawable/my_shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#FFFF00" />
<padding android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
</shape>
我在我的应用程序的几个地方用作某些 TextView
的背景。就像 layout/my_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout...>
<TextView
android:id="@+id/tag"
android:background="@drawable/my_drawable"
android:layout_height="wrap_content"
android:layout_width="wrap"
android:text="Some text"
/>
<!-- other tags -->
</RelativeLayout>
或在用作列表项的布局中 layout/my_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout...>
<TextView
android:id="@+id/subject"
android:background="@drawable/my_drawable"
android:layout_height="wrap_content"
android:layout_width="wrap"
/>
<!-- other tags -->
</RelativeLayout>
现在,当我以编程方式更改列表 ArrayAdapter
中形状的颜色时,片段中 TextView
的背景位于 中完全不同的位置我的应用 获得了与列表中最后一项相同的颜色!从那时起,具有更改颜色的形状将用于布局中具有 my_fragment.xml 的所有其他活动。
holder.subject = (TextView) v.findViewById(R.id.subject);
GradientDrawable bgShape = (GradientDrawable)holder.subject.getBackground();
bgShape.setColor( position % 2 == 0 ? Color.BLACK : Color.WHITE );
这怎么可能,我怎样才能避免这种 "reuse" 行为?
这是我的数组适配器的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder; // to reference the child views for later actions
if (v == null) {
LayoutInflater vi =
(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.my_list_item, null);
// cache view fields into the holder
holder = new ViewHolder();
holder.subject = (TextView) v.findViewById(R.id.subject);
// associate the holder with the view for later lookup
v.setTag(holder);
}
else {
// view already exists, get the holder instance from the view
holder = (ViewHolder) v.getTag();
}
GradientDrawable bgShape = (GradientDrawable)holder.subject.getBackground();
bgShape.setColor( position % 2 == 0 ? Color.BLACK : Color.WHITE );
holder.subject.setText(getItem(position));
}
// somewhere else in your class definition
static class ViewHolder {
TextView subject;
}
我必须使用 bgShape.mutate().setColor(..)
另见
- Android: Cloning a drawable in order to make a StateListDrawable with filters
- http://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate%28%29