Gallery中的子视图处理Click事件

本文探讨了解决Gallery内视图处理OnClickListener事件后无法拨动的方案,通过在子视图处理完touch事件后再让Gallery处理,避免了touch事件被子视图拦截的情况。同时,文章提供了实现此方案的核心代码,适用于需要在Gallery中展示复杂布局的场景。

转自http://obacow.iteye.com/blog/1330833

Gallery中如果是要响应某一视图的点击事件只要设置setOnItemClickListener即可。通常的照片浏览不会有复杂的交互处理逻辑。但是如果gallery的视图不是简单的一张照片而是复杂的视图(Gallery的灵活应用将会为您带来很多的便利)。如需要模仿多屏切换的桌面效果(如android桌面的workspace效果),除了使用ViewFlipper或从android源码中提取workspace,gallery也是个相当好的替代方法。gallery原有的切换动画效果和其成熟稳定性,总比自己造轮子的风险小。

Gallery内的视图是一个复杂的布局时,总避免不了屏幕内的子视图需要去接管touch、click等事件。遗憾的是如果Gallery的视图自己处理了OnClickListener则会导致gallery不能拨动。就如ScrollView遇到ListView不能滚动一样的问题,应该是这2个控件在设计上的一个缺陷。本文探讨类似冲突的一种解决方案。
       之所以会出现 Gallery内的视图处理了OnClickListener事件后不能拨动,是因为子视图接管了touch事件后而未返回给gallery处理。所以解决的办法很简单:在子视图处理完touch事件后再让gallery处理即可。
核心的代码如下:

 

Java代码   收藏代码
  1. gallery.setAdapter(new ArrayAdapter<Integer>(ctx, 0, WHATSNEW) {  
  2.     public View getView(int position, View convertView, final ViewGroup parent) {  
  3.     ImageView image = null;  
  4.     if (convertView == null) {  
  5.         image = new ImageView(getContext()){  
  6.         public boolean onTouchEvent(MotionEvent event) {  
  7.             boolean b=super.onTouchEvent(event);  
  8.               
  9.             //提交给gallery处理  
  10.             gallery.onTouchEvent(event);  
  11.             return b;  
  12.         }  
  13.           
  14.         };  
  15.         image.setScaleType(ScaleType.FIT_XY);  
  16.         image.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
  17.     } else {  
  18.         image = (ImageView) convertView;  
  19.     }  
  20.       
  21.     //处理自己的事件  
  22.     image.setOnClickListener(new View.OnClickListener() {  
  23.         @Override  
  24.         public void onClick(View arg0) {  
  25.         Toast.makeText(ctx, "you click me!", Toast.LENGTH_LONG).show();  
  26.         }  
  27.     });  
  28.   
  29.     image.setBackgroundColor(Color.BLACK);  
  30.     image.setImageResource(WHATSNEW[position]);  
  31.     return image;  
  32.     }  
  33. });  
 
同理,当ScrollView遇到ListView时只要用这种方法即可!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值