问题描述
所以我有这段代码,我试图获取已单击的textView的当前背景颜色。
我收到以下错误:
java.lang.ClassCastException:android.graphics.drawable.GradientDrawable无法转换为android.graphics.drawable.ColorDrawable
private final class ChoiceTouchListener implements OnTouchListener {
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
TextView textViewTouched = (TextView) view;
***error at this line*** ColorDrawable textViewBackground = (ColorDrawable)textViewTouched.getBackground();
//change color of textView quickly so that the shadow dragged object made down below
//will have a different colour then textView
view.setBackgroundColor(0xfff00000);
//setup drag
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
//start dragging the item touched
view.startDrag(data, shadowBuilder, view, 0);
//change the textView colour back so the user doesn't see a change so that the
//shadow object is a different colour then the textView
view.setBackgroundColor(0xf32cd320);
return true;
}
else {
return false;
}
}
}
但是如果我搬家
ColorDrawable textViewBackground = (ColorDrawable)textViewTouched.getBackground();
到下面
view.setBackgroundColor(0xfff00000);
它工作正常。
我不知道为什么要这样做,但是在应用新颜色之前,我需要获得背景色。
编辑
我还应该提到,我在代码中的功能较低的位置有此功能,并且在该功能中效果很好。
更多编辑
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/DisplayConfig"
android:keepScreenOn="true">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="0dp"
android:paddingLeft="0dp"
android:paddingRight="0dp">
<TextView
android:layout_width="fill_parent"
android:layout_height="18.5dp"
android:gravity="center"
android:paddingBottom="0dp"
android:text="@string/intro" />
<TextView
android:id="@+id/option_1"
android:layout_width="fill_parent"
android:layout_margin="0dp"
android:background="@drawable/drag_drop_option"
android:gravity="left"
android:text="@string/option_1"
android:textStyle="normal"
android:textColor="#FFFFFF"
android:layout_height="150dp" />
<TextView
android:id="@+id/option_2"
android:layout_width="fill_parent"
android:layout_margin="0dp"
android:background="@drawable/drag_drop_option"
android:gravity="left"
android:text="@string/option_2"
android:textColor="#FFFFFF"
android:textStyle="normal"
android:layout_height="150dp" />
<TextView
android:id="@+id/option_3"
android:layout_width="fill_parent"
android:layout_margin="0dp"
android:background="@drawable/drag_drop_option"
android:gravity="left"
android:text="@string/option_3"
android:textColor="#FFFFFF"
android:textStyle="normal"
android:layout_height="151dp" />
</LinearLayout>
<LinearLayout android:id="@+id/bottom_button_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:background="#000000"
android:orientation="horizontal">
<Button android:id="@+id/occupancy_button"
style="?android:attr/borderlessButtonStyle"
android:layout_width="wrap_content"
android:layout_height="72dp"
android:layout_weight="1"
android:text="Room Mode"
android:textColor="#FFFFFF"/>
</LinearLayout>
</FrameLayout>
这样就可以完成侦听器视图的设置。
option1.setOnTouchListener(new ChoiceTouchListener());
1楼
也许您没有ColorDrawable
而是另一种类型,所以您正在获得ClassCast
?
在看, Drawable
有很多子类
已知直接子类
AnimatedVectorDrawable,AnimatedVectorDrawableCompat,BitmapDrawable, ColorDrawable ,DrawableContainer,DrawableWrapper,DrawerArrowDrawable, GradientDrawable ,LayerDrawable,NinePatchDrawable,PictureDrawable,RoundedBitmapDrawable,ShapeDrawable,VectorDrawable,VectorDrawableCompat
已知的间接子类
AnimatedStateListDrawable,AnimationDrawable,ClipDrawable,InsetDrawable,LevelListDrawable,PaintDrawable,RippleDrawable,RotateDrawable,ScaleDrawable,StateListDrawable,TransitionDrawable
编辑:
返回Drawable
,您将立即将其强制转换为(ColorDrawable)
。
stacktrace表示这不是ColorDrawable, but GradientDrawable
,这是Drawable
另一个子类
正在为背景创建ColorDrawable
,因此当您在行下方移动并强制转换为ColorDrawable
它可能不会对其他视图引发任何错误,因为这些视图可能以其他方式更早设置了背景颜色
EDIT2:
您可以使用instanceOf
检查,但这不是解决问题的有效且最佳的方式...
if( ! textViewTouched.getBackground() instanceOf ColorDrawable)
textViewTouched.setBackgroundColor(Color.parseColor("#32cd32"));
ColorDrawable textViewBackground = (ColorDrawable)textViewTouched.getBackground();