Xamarin Android如何获取ImageView当前图片名并实现条件判断
Xamarin Android 获取ImageView当前图片并做匹配判断的实现方案
原代码存在的问题
- 第二个ImageView(imageViewLf)的点击事件逻辑错误,操作的是imageViewUf控件,无法正常切换自身图片
- 两个ImageView共用同一个计数变量
numberUf,点击任意一个控件都会累加同一个计数,切换逻辑混乱 - 图片匹配判断逻辑只执行一次,不会在每次点击切换图片后自动触发
- 没有记录当前显示的图片资源标识,无法直接完成比对
最优实现方式
不需要反向从ImageView控件读取资源名称,直接在切换图片时记录当前设置的资源ID即可,性能更好也不会出现兼容问题,完整实现代码如下:
- 先在Activity类中定义全局变量,避免方法执行完变量被回收
// 两个ImageView各自的点击计数 private int _clickCountUf = 0; private int _clickCountLf = 0; // 记录两个ImageView当前显示的图片资源ID private int _currentImgResUf; private int _currentImgResLf; // 控件声明 private ImageView _imgUf; private ImageView _imgLf; private TextView _resultTv;
- 在OnCreate生命周期方法中初始化控件、绑定点击事件
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 替换成你自己的布局文件名 SetContentView(Resource.Layout.Main); // 初始化控件 _imgUf = FindViewById<ImageView>(Resource.Id.imageView1); _imgLf = FindViewById<ImageView>(Resource.Id.imageView2); _resultTv = FindViewById<TextView>(Resource.Id.textView1); // 绑定第一个ImageView点击切换事件 _imgUf.Click += (s, e) => { _clickCountUf++; // 如果需要循环切换,超过2次就回到第一张,不需要循环可以删掉下面这行 if (_clickCountUf > 2) _clickCountUf = 1; switch (_clickCountUf) { case 1: _currentImgResUf = Resource.Drawable.a03SF9AP56UF; break; case 2: _currentImgResUf = Resource.Drawable.a01SF5BP52UF; break; } _imgUf.SetImageResource(_currentImgResUf); // 切换完成后检查匹配状态 CheckMatchRule(); }; // 绑定第二个ImageView点击切换事件 _imgLf.Click += (s, e) => { _clickCountLf++; // 循环切换逻辑,不需要可以删掉 if (_clickCountLf > 2) _clickCountLf = 1; switch (_clickCountLf) { case 1: _currentImgResLf = Resource.Drawable.a02SF8BP55LF; break; case 2: _currentImgResLf = Resource.Drawable.a03SF9BP56LF; break; } _imgLf.SetImageResource(_currentImgResLf); // 切换完成后检查匹配状态 CheckMatchRule(); }; }
- 单独封装匹配规则判断方法,每次切换图片后调用
private void CheckMatchRule() { // 直接比对资源ID,比转字符串比对名称效率更高 if (_currentImgResUf == Resource.Drawable.a03SF9AP56UF && _currentImgResLf == Resource.Drawable.a03SF9BP56LF) { _resultTv.Text = "something"; } // 可以按需增加更多条件分支,对应不同的展示文本 else { _resultTv.Text = string.Empty; // 不满足条件时清空文本或设置默认值 } }
补充说明
- 如果确实需要获取图片对应的资源名称,可以通过
Resources.GetResourceEntryName(资源ID)方法获取,比如Resources.GetResourceEntryName(_currentImgResUf)就会返回对应drawable的文件名字符串,但非必要不建议用字符串做判断,资源ID是整数类型,比对性能更高也不会出现拼写错误。 - 代码中已经修正了原代码里控件操作错误、计数器共用的问题,直接替换原有逻辑即可运行。
内容的提问来源于stack exchange,提问作者arian ahmadi
相关产品推荐
相关产品推荐

