同ListView该接口无法通过手势滑动左右切换界面问题解决方法

问题描写叙述:

在做OnGestureListener滑动切换窗体的时候,会遇到这种问题。就是当界面中含有ListView的时候。OnGestureListener的左右触屏滑动就被ListView自己吃掉了。

问题分析:

在Android系统中,事件的分发和响应都依照一定的优先级唯独条的进行着。假设Activity中包括ListView那么系统的onTouchEvent事件会优先分发给ListView去处理。这时ListView的OnItemClickListener监听器会优先响应onTouchEvent事件。从而导致GestureDetector无法接收到系统的onTouchEvent事件。

解决方法:

解决方法主要有两种:

第一种:改变系统分发的onTouchEvent事件的顺序。这样的方式比較简单。

另外一种:自己定义ListView使其支持GestureDetector的OnGestureListener。这样的方式相对于第一种方式比較复杂。

以下就详细介绍两种方式的在详细做法。

第一种:改变系统分发的onTouchEvent事件的顺序:

/**
* 重写此方法将触控事件优先分发给GestureDetector,以解决滑动ListView无法切换屏幕的问题、
* */
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
this.gestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}

另外一种:自己定义ListView使其支持GestureDetector的OnGestureListener:

第一步:自己定义ListView:

/**
*自己定义带有手势的listview。
*/
class GestureList extends ListView {
int flag=BaseActivity.flag;
Context context;
GestureDetector gestureDetector;
/**
* 在xml布局里面使用GestureList,默认的会调用这个构造方法
* @param context
* @param attrs
*/
public GestureList(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.context=context;
gestureDetector=new GestureDetector(context,new Gesture(context));
}
public GestureList(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
this.context=context;
gestureDetector=new GestureDetector(context,new Gesture(context));
}
public GestureList(Context context) {
super(context);
// TODO Auto-generated constructor stub
this.context=context;
gestureDetector=new GestureDetector(context,new Gesture(context));
}
@Override
public boolean onTouchEvent(MotionEvent ev) { if(gestureDetector.onTouchEvent(ev)) return true;
return super.onTouchEvent(ev);
}
}

第二步:为自己定义的ListView创建手势监听器:

public class Gesture implements OnGestureListener{
/**得到全局的标志位**/
int flag=BaseActivity.flag;
/**要切换有切换的activity的个数**/
int length=BaseActivity.myClass.length;
@SuppressWarnings("rawtypes")
/**得到activity数组 **/
Class[] myClass=BaseActivity.myClass;
Context context;
public Gesture(Context context) {
// TODO Auto-generated constructor stub
this.context=context;
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
} @Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub }
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub }
@Override
/**
* 滑动事件的处理
*/
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
//左滑动
if (e1.getX() - e2.getX() > 50) {
Log.i("Fling", "Gesture:左滑动 ");
if (++flag>=length) {
flag=length-1;
//改变BaseActivity。让其知道标志位改变了
BaseActivity.flag=flag;
return true;
}
BaseActivity.flag=flag;
Intent intent=new Intent(context, myClass[flag]);
//用这个FLAG启动的Activity,一旦退出。就不会存在于栈中
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent. FLAG_ACTIVITY_REORDER_TO_FRONT);
//须要context才干启动activity
context.startActivity(intent);
return true;
}
//右滑动
else if (e2.getX() - e1.getX()>50) {
Log.i("Fling", "Gesture:右滑动 ");
if (--flag<0) {
flag=0;
//改变BaseActivity。让其知道标志位改变了
BaseActivity.flag=flag;
return true;
}
BaseActivity.flag=flag;
Intent intent=new Intent(context,myClass[flag]);
//用这个FLAG启动的Activity,一旦退出,就不会存在于栈中
intent.setFlags(Intent. FLAG_ACTIVITY_NO_HISTORY|Intent. FLAG_ACTIVITY_REORDER_TO_FRONT);
//须要context才干启动activity
context.startActivity(intent);
// System.exit(0);//退出当前Activity
return true;
}
return true;
}
}

第三步:在布局界面引用自己定义的ListView:

<com.jph.custom.GestureList android:id="@+id/list"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:focusable="false"
/>

版权声明:本文博客原创文章。博客,未经同意,不得转载。

同ListView该接口无法通过手势滑动左右切换界面问题解决方法的更多相关文章

  1. Android开发之手势滑动(滑动手势监听)详解

    Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...

  2. Android中ViewPager如何设置不能通过屏幕左右滑动来切换页面

    //很多时候,我想禁止用户通过屏幕的左右滑动来切换界面!如何实现! //创建一个类继承viewpager,实现 onTouchEvent   和   onInterceptTouchEvent方法,都 ...

  3. android 手势滑动

    1.概述, 两次都是画曲线统计图用到手势滑动.左滑动,右滑动曲线图翻页 2.直接上代码 3.注: 第一次使用的时候是implement了 OnTouchListener 接口,是在画图布局上layou ...

  4. [android] 手机卫士手势滑动切换屏幕

    定义手势识别器 获取手势识别器GestureDetector对象,通过new GestureDetector(context,listener),参数:上下文,监听器 匿名内部类实现简单手势监听器Si ...

  5. iOS之手势滑动返回功能-b

    iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...

  6. 禁用ios7 手势滑动返回功能

    禁用ios7 手势滑动返回功能 版权声明:本文为博主原创文章,未经博主允许不得转载. 在有的时候,我们不需要手势返回功能,那么可以在页面中添加以下代码: - (void)viewDidAppear:( ...

  7. 手势滑动结束 Activity(一)基本功能的实现

    喜欢听音乐的朋友可能都看过天天动听这款 app, 这款 app 有一个亮点就是在切换页面(Fragment)的时候能够通过手势滑动来结束当前页面.这里先说一下,我为什么会这么关心这个功能呢,由于前两天 ...

  8. Android手势滑动Tab

    Android手势滑动Tab //MainActivity.java public class MainActivity extends TabActivity { ; ; ; private Ges ...

  9. css 的通用样式 设置 和倒计时功能 移动轮播图的手势滑动的功能

    body{ line-height:1.4; color:#333; font-family:arial; font-size: 12px; background:white; } input,tex ...

随机推荐

  1. DOM的event对象的属性和方法

    属性/方法 类型 是否可读写 描写叙述 altKey Boolean 读写 指示是否按下alt键 bubbles Boolean 读 指示事件是否冒泡 button Intrger 读写 鼠标事件发生 ...

  2. Remote Desktop Organizer – 管理组织远程桌面 - 小众软件

    http://www.appinn.com/remote-desktop-organizer/

  3. Egret是一套完整的HTML5游戏开发解决方案

    Egret是一套完整的HTML5游戏开发解决方案.Egret中包含多个工具以及项目.Egret Engine是一个基于TypeScript语言开发的HTML5游戏引擎,该项目在BSD许可证下发布.使用 ...

  4. HDU3537-Daizhenyang&#39;s Coin(博弈SG-打表)

    <span style="color: green; font-family: Arial; font-size: 12px; background-color: rgb(255, 2 ...

  5. java 处理时间的各种方式——获取时间——时间格式化

    TimeUtil.java package com.snow; import java.text.DateFormat; import java.text.ParseException; import ...

  6. C的xml编程文章链接

    官方地址:http://www.xmlsoft.org/ http://hi.baidu.com/singyea/item/ed4d1c335a9527b8633aff82 http://os.chi ...

  7. Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,相似图片浏览器

    MAC : XCode -> Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,类似图片浏览器 STEP1:将两个目录复制到project里面ImageBrowser ...

  8. SOHO路由器的静态路由的不同

    网络拓扑如下,其中RA与RB皆为TP-LINK家用路由器 最终在TP-LINK官网的官网上找到这么一段话 静态路由是在路由器中手工设置的固定的路由条目.我司路由器静态路由是基于ICMP重定向原理,与其 ...

  9. J2EE请求和响应—Servlet

    一.什么是Servlet? Servlet是执行Webserver上的一个特殊Java类.其特殊用途是响应client请求并做出处理.使得client与server端进行交互. 二.生命周期  Ser ...

  10. 关于Core Location-ios定位

    IOS中的core location提供了定位功能,能定位装置的当前坐标,同一时候能得到装置移动信息.由于对定位装置的轮询是非常耗电的,所以最好仅仅在非常必要的前提下启动. 当中,最重要的类是CLLo ...