同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. 该项目的建设maven片:4.协调和依赖,spring依赖注入demo

    源码下载 协调 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId& ...

  2. const void *a 与 void *const a 的差别

    const void *a 这是定义了一个指针a,a能够指向随意类型的值,但它指向的值必须是常量. 在这样的情况下,我们不能改动被指向的对象,但能够使指针指向其它对象. 比如: const void ...

  3. Set vs. Set<?>(转)

    You may know that an unbounded wildcard Set<?> can hold elements of any type, and a raw type S ...

  4. PHP移动互联网开发笔记(2)——变量及常量

    原文地址:http://www.php100.com/html/php/rumen/2014/0326/6703.html 一.PHP5.4的基本的语法格式 1.PHP的切割符 view source ...

  5. 《JavaScript设计模式与开发实践》读书笔记之享元模式

    1. 享元模式 享元模式是一种用于性能优化的模式,享元模式的核心是运用共享技术来有效支持大量细粒度的对象 1.1 传统的文件上传方法 以文件上传为例,文件上传功能可以选择依照队列,一个一个的排队上传, ...

  6. Windows phone 8 学习笔记(1) 触控输入

    原文:Windows phone 8 学习笔记(1) 触控输入 Windows phone 8 的应用 与一般的Pc应用在输入方式上最大的不同就是:Windows phone 8主要依靠触控操作.因此 ...

  7. MVC的DependencyResolver组件

    MVC的DependencyResolver组件 一.前言 DependencyResolver是MVC中一个重要的组件,从名字可以看出,它负责依赖对象的解析,可以说它是MVC框架内部使用的一个IOC ...

  8. J2SE基础:4.面向对象的特性一

    面向对象的特性 封装 继承多态 封装: 定义: 通过对象的封装,实现了模块化和信息隐藏. 通过对类的成员施以一定的訪问权限,实现了类中成员 的信息隐藏 注意点: 对象自已该做的一些事情与方法不能交与其 ...

  9. UVA - 12232 Exclusive-OR (并查集扩展偏离向量)

    Description You are not given n non-negative integersX0,X1,..., Xn-1 less than220, but they do exist ...

  10. 【ALearning】第四章 Android Layout组件布局(一)

    在本章中,我们将Android学习组件布局.在前面的章节,我们也开始使用LinearLayout布局.然后我们在布局文件更加具体的学习和理解,会. Android的界面是有布局和组件协同完毕的,布局好 ...