You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:Drawable类型转换报错,findViewById调用出现类型不匹配

解决Drawable类型转换错误的问题

嘿,这个问题我之前也踩过坑!咱们先搞清楚为啥会报错:

你写的代码 mydrawable = (Drawable) findViewById(R.drawable.mydrawable); 犯了一个典型的混淆——findViewById()是用来查找布局里的View组件的,它的返回值是View类型,而你传入的R.drawable.mydrawable是Drawable资源的ID,不是某个View的ID,这就导致你把一个View强制转换成Drawable,自然会抛出类型不兼容的错误。

正确的做法分两种情况:


1. 直接获取Drawable资源文件

如果你只是想拿到res/drawable里的那个Drawable文件,别用findViewById,改用资源管理器或者兼容工具类:

  • 适配API 21及以上的写法:
mydrawable = getResources().getDrawable(R.drawable.mydrawable, getTheme());
  • 兼容所有Android版本的推荐写法(用ContextCompat自动适配):
mydrawable = ContextCompat.getDrawable(this, R.drawable.mydrawable);

2. 获取某个View上的Drawable

如果你的Drawable是某个View的背景或者ImageView的图片资源,那得先找到对应的View,再从View上获取:
比如你的ImageView的ID是R.id.my_image_view:

// 先找到ImageView
ImageView myImageView = findViewById(R.id.my_image_view);
// 获取ImageView的src对应的Drawable
mydrawable = myImageView.getDrawable();
// 或者如果是View的背景Drawable
mydrawable = myImageView.getBackground();

简单来说就是:findViewById()找的是R.id.xxx的View,拿Drawable资源就用getResources()或者ContextCompat,别搞混啦!

内容的提问来源于stack exchange,提问作者user9735582

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:42:15