Gallery中的子视图处理Click事件

来源:互联网 发布:linux vi文件编辑命令 编辑:程序博客网 时间:2024/06/01 20:20
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处理即可。
下面借上一篇<<whatsnew界面>>的实例来讲解,核心的代码如下:

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. //提交给gallery处理
  9. gallery.onTouchEvent(event);
  10. return b;
  11. }
  12. };
  13. image.setScaleType(ScaleType.FIT_XY);
  14. image.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
  15. } else {
  16. image = (ImageView) convertView;
  17. }
  18. //处理自己的事件
  19. image.setOnClickListener(new View.OnClickListener() {
  20. @Override
  21. public void onClick(View arg0) {
  22. Toast.makeText(ctx, "you click me!", Toast.LENGTH_LONG).show();
  23. }
  24. });
  25. image.setBackgroundColor(Color.BLACK);
  26. image.setImageResource(WHATSNEW[position]);
  27. return image;
  28. }
  29. });

同理,当ScrollView遇到ListView时只要用这种方法即可!
原创粉丝点击