当前位置: 代码迷 >> Android >> 获取textView的背景颜色(我不知道发生了什么事)
  详细解决方案

获取textView的背景颜色(我不知道发生了什么事)

热度:94   发布时间:2023-08-04 11:51:23.0

所以我有这段代码,我试图获取已单击的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());

也许您没有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();
  相关解决方案