本文原创,转载请注明原文出处:http://maosidiaoxian.iteye.com/blog/1472873
或者我的另外一个博客: http://msdxblog.sinaapp.com/?p=371
现在许多应用都有一个“再按一次退出”的效果,其实实现这个不难,具体可以看我的另外一篇文章:http://maosidiaoxian.iteye.com/blog/1403040
不过最近又对以前写的东西再次封装,原因是以前是写死了,一定是“再次一次退出”的效果,而没有“再按一次XXX”的。而出现这个需求是因为最近在写的一个小的游戏应用,有“新游戏”的按钮,我觉得在响应这个事件时先弹出一个对话框来确认是否开始新游戏没什么必要,因为频率比较高,久了用户会很烦。朋友说可以做成“再按一次开始新游戏”。
于是封装了“再次一次XXX”的代码。具体如下:
/*
* @(#)DoubleClick.java Project:com.sinaapp.msdxblog.androidkit
* Date:2012-3-20
*
* Copyright (c) 2011 CFuture09, Institute of Software,
* Guangdong Ocean University, Zhanjiang, GuangDong, China.
* All rights reserved.
*/
package com.sinaapp.msdxblog.androidkit.ui.util;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.widget.Toast;
/**
* @author Geek_Soledad (66704238@51uc.com)
*/
public abstract class DoubleClick {
protected Context mContext;
private boolean willDo;
private Runnable task = new Runnable() {
@Override
public void run() {
willDo = false;
}
};
public DoubleClick(Context context) {
mContext = context;
}
/**
* 当某个动作要双击才执行时,调用此方法。
*
* @param delayTime
* 判断双击的时间。
* @param msg
* 当第一次点击时,弹出的提示信息。如果为null,则不作提示。
*/
public void doDoubleClick(int delayTime, String msg) {
if (willDo) {
doOnDoubleClick();
} else {
keepInDelayTime(delayTime);
showMsgInToast(delayTime, msg);
}
}
/**
* 在双击之后执行的事情。
*/
abstract protected void doOnDoubleClick();
/**
* 判断是否双击。
*
* @param delayTime
* 是否双击的判断时间。
*/
final private void keepInDelayTime(int delayTime) {
willDo = true;
HandlerThread thread = new HandlerThread("doTask");
thread.start();
new Handler(thread.getLooper()).postDelayed(task, delayTime);
}
/**
* 显示提示信息。
*
* @param msg
* 要显示的信息。
*/
private void showMsgInToast(int delayTime, String msg) {
if (msg != null) {
Toast.makeText(mContext, msg, delayTime).show();
}
}
}
然后关于再按一次退出,仅需要继承以上类并实现其抽象方法即可。
/**
* 在双击之后执行的事情。
*/
abstract protected void doOnDoubleClick();
以下是“再次一次退出”的再次封装。不过这里我用的是单例模式,一个是我觉得对于一个应用,退出也就完了,所以它对应的这个“再次一次退出”的辅助类也是只有一个的,另一个是单例模式的话,我不需要为它写个成员变量,再在一开始的时候对它初始化,对我原来的代码影响很小。代码如下:
/*
* @(#)ExitDoubleClick.java Project:com.sinaapp.msdxblog.androidkit
* Date:2012-3-20
*
* Copyright (c) 2011 CFuture09, Institute of Software,
* Guangdong Ocean University, Zhanjiang, GuangDong, China.
* All rights reserved.
*/
package com.sinaapp.msdxblog.androidkit.ui.util;
import android.app.Activity;
import android.content.Context;
/**
* 双击退出Activity的类。
*
* @author Geek_Soledad (66704238@51uc.com)
*/
public class ExitDoubleClick extends DoubleClick {
private static ExitDoubleClick exitDoubleClick;
private ExitDoubleClick(Context context) {
super(context);
}
/**
* 返回一个双击退出的实例。
*
* @param context
* @return ExitDoubleClick
*/
public static synchronized ExitDoubleClick getInstance(Context context) {
if (exitDoubleClick == null) {
exitDoubleClick = new ExitDoubleClick(context);
}
return exitDoubleClick;
}
/**
* 双击之后退出。
*/
@Override
protected void doOnDoubleClick() {
((Activity) mContext).finish();
exitDoubleClick = null;
}
/* (non-Javadoc)
* @see com.sinaapp.msdxblog.androidkit.util.DoubleClick#doDoubleClick(int, java.lang.String)
*/
@Override
public void doDoubleClick(int delayTime, String msg) {
if (msg == null || msg.equals("")) {
msg = "再按一次退出";
}
super.doDoubleClick(delayTime, msg);
}
}
注意,在退出之后需要对exitDoubleClick赋值为null(或者可以调用System.exit(0)方法?),否则在下次启动时可能无法正常退出,因为这时调用的mContext已经不是当前的Activity实例了,所以无法对当前的Activity实例用finish()退出。
分享到:
相关推荐
RecyclerView基类的封装(单击双击事件)及附demo完整使用操作
C# Button双击事件大家一定相当熟悉了,本文笔者又再一次为你阐述了C# Button双击事件的原理及实现 方法。 C# Button是有DoubleClick事件的,只是它没有出现在事件列表中,而且.net也是把这个事件给"屏蔽" 掉了...
android中实现按两次返回键退出Activity,不再是返回一次就退出应用,第一次点击提示“再按一次退出应用”
用过windows的shift按键童鞋都知道,按下五次会有个弹出提示框,本实例类似win的那个五次按下shift功能,做此例子的本意是要获取双击事件,本例非常简单,适合大家一起学习。
有关单片机的 按键 长按 短按 双击 组合按程序分享啊
双击事件:俩次短按时间间隔小于500ms,俩次短按操 本程序只供学习使用,未经作者许可,不得用于其它任何用途 感谢大家的阅读与下载,码字开源分享不易,麻烦给个免费的赞。 如果有帮助的,请不要吝啬三连。点赞...
ListBox 项的双击事件 ListBox 项的双击事件
安卓控件单击、双击事件共存,下载附件运行即可
C# winform 单击与双击事件同时存在例子 在wiform中单击与双击事件是不可以同时存在的。
nrf52832 nrf52810 按键驱动,兼任单次按键处理,双击处理,长按处理。通过KeyScanCallBack响应按键消息。修改best_board_key.h即可定位不同的io。
只好想了一个土办法:原理是用时间来判断,当我点这个 imageview控件的onclick事件时,开始计数,如果在某个时间内值还没有第二点击,那么就判断为单机,如果发生了两次或两次以上,则都视为双击! 单击双击事件
六脚自锁式按键PCB封装,初学者可以作为参考再制作一个,使用时直接在原理图中双击按键的图标,在弹出界面的右下角修改footprint即可!
fullcalendar扩展双击事件 源码版(直接改动源码)和扩展版(支持新版本)
在echarts点击事件基础上添加单击和双击事件,使单双击事件并存。该资源为用html和jquery实现的简单的单双击事件并存的demo。
能实现双击事件,双击单击调用对应方法。快来下载吧,不懂可以留言
STM32按键(单击、双击、长按)操作
jQuery-doubleTap是一款非常有用的鼠标双击事件或移动设备的触摸双击事件检测jQuery插件。该插件通过对“click”和“touch”的简单代码优化来实现鼠标双击或触摸双击事件的检测
ExtJs GridPanel双击事件获得双击的行,双击行可以选中前面的checkbox,并获得行号
主要介绍了C#实现给DataGrid单元行添加双击事件的方法,较为详细的分析了C#给DataGrid单元添加双击事件的步骤及相关实现代码,具有一定参考借鉴价值,需要的朋友可以参考下
STM32C8T6按键长按双击。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。