Kotlin Android中ImageView.getTag()返回null问题咨询
问题场景
Android开发使用Kotlin实现功能时,尝试通过tag属性切换ImageView的显示图片,但调用getTag()方法时返回值为null,无法定位问题原因,相关实现代码如下:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val iv = findViewById<ImageView>(R.id.iv) iv.setImageResource(R.drawable.morado) iv.setOnClickListener{ val path = R.drawable.verde val s = iv.getTag(path.toString().toInt()) Log.d("TAG", "onCreate: $s") // 此处$s打印为null,但verde drawable文件真实存在 //iv.setImageResource(a) } }
代码运行时Log打印的变量s值为null,但项目内名为verde的drawable资源文件真实存在。
问题根因
View.getTag(int key)方法返回null的核心原因是对API作用的理解错误:
- 该方法的唯一作用是读取View上存储的自定义附加数据,前提是之前已经通过
setTag(int key, Object value)给传入的key绑定过对应值。从未给对应key执行过set操作时,无论传入什么参数,返回值必然是null。 - 传入的
R.drawable.verde是编译阶段生成的整型资源ID,不是之前设置tag使用的key,也没有任何代码给这个key绑定过值。getTag()本身不负责加载drawable资源,哪怕verde文件真实存在,也不会自动返回对应的资源对象。 - 代码中
path.toString().toInt()是冗余无效操作:R.drawable.verde本身就是Int类型,转字符串再转回Int得到的值和原值完全一致,对结果没有任何影响。
正确实现参考
如果要实现点击ImageView在两张图片间切换的效果,可以借助tag存储当前展示的资源ID,先赋值再读取,参考代码如下:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val iv = findViewById<ImageView>(R.id.iv) // 初始给tag赋值为当前加载的资源ID iv.setImageResource(R.drawable.morado) iv.tag = R.drawable.morado iv.setOnClickListener { val currentResId = it.tag as Int val nextResId = if (currentResId == R.drawable.morado) { R.drawable.verde } else { R.drawable.morado } it.setImageResource(nextResId) it.tag = nextResId } }
如果要使用带key参数的多tag重载方法,规则完全一致:必须先调用
setTag(int key, Object)给指定key绑定值,之后才能通过对应key调用getTag(int)拿到存储的内容。
内容的提问来源于stack exchange,提问作者Franqo Balsamo
相关产品推荐
相关产品推荐

