同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. java--基于socket的网络传输开发

    继http://blog.csdn.net/gaopeng0071/article/details/10959845此文章内容展开的研究. socket传输是基于tcp的网络传输协议进行的传输,tcp ...

  2. (转)在 Visual Studio 2010 中创建 ASP.Net Web Service

    很多人在论坛里说,在Visual Studio 2010中不能创建“ASP.Net Web Service”这种project了,下面跟帖者云云,有的说这是因为微软已经将Web Service整合进W ...

  3. three.js是JavaScript编写的WebGL第 三方库

    three.js是JavaScript编写的WebGL第 三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质 ...

  4. HttpApplication处理对象与HttpModule处理模块

    HttpApplication处理对象与HttpModule处理模块 (第三篇) 一.HttpApplication对象简述 在HttpRuntime创建了HttpContext对象之后,HttpRu ...

  5. Knockout应用开发指南 第三章:绑定语法(2)

    原文:Knockout应用开发指南 第三章:绑定语法(2) 7   click 绑定 目的 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用 ...

  6. swift 新功能介绍

    原文链接:http://www.cocoachina.com/applenews/devnews/2014/0617/8857.html 假设你和我一样,准备好好看看苹果的 Keynote,兴奋地准备 ...

  7. 边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法

    [原标题] 1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1998  Solved: 816 [id=10 ...

  8. codeforces293E (树上点分治+树状数组)

    和poj1747相比起来,只不过是限制条件多了一维. 而多了这一维,所以需要用树状数组来维护,从而快速得到答案. 因为没注意传进树状数组函数的参数可能是<=0的,导致超时了好久. #pragma ...

  9. linux下使用vi操作

    ESC : 进入命令模式 linux下使用vi后,怎样跳转到文件结尾 pagedown键连续按 虽然我也这么用,但还是太笨了.问了高手,方法是按shift+g,另外,到文件开头是gg.   linux ...

  10. jquery动态加入删除一行数据

    <html> <head> <title>加入.删除一行</title> <meta http-equiv="content-type& ...