预览一下:
Android中的按钮是继承之TextView的,今天想了一会儿怎么对按钮进行一些点击上的优化或者说是定制吧。原理是自定义一个抽象的‘监听器’实现我们的OnClickListener然后在重写的onClick里面根据不同的业务逻辑来调用我们所定制的Click事件(即一个抽象的方法)
-Think For Button
--1.Button怎么样做到防止多次点击多次触发一个事件,特别是网络请求时应该注意的问题
--2.Button的双击事件的实现
--3.Button的在有网络和无网络情况下对用户的反馈
--4.Button的点击事件的个性化制定
1.防止多次触发
import android.view.View;
import android.view.View.OnClickListener;
public abstract class OnFastClickListener implements OnClickListener {
// 防止快速点击默认等待时长为1100ms
private long DELAY_TIME = 1100;
private static long lastClickTime;
private boolean isFastDoubleClick() {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (0 < timeD && timeD < DELAY_TIME) {
return true;
}
lastClickTime = time;
return false;
}
@Override
public void onClick(View v) {
// 判断当前点击事件与前一次点击事件时间间隔是否小于阈值
if (isFastDoubleClick()) {
return;
}
onFastClick(v);
}
/**
* 设置默认快速点击事件时间间隔
* @param delay_time
* @return
*/
public OnFastClickListener setLastClickTime(long delay_time) {
this.DELAY_TIME = delay_time;
return this;
}
/**
* 快速点击事件回调方法
* @param v
*/
public abstract void onFastClick(View v);
}
2.按钮的双击事件
import android.view.View;
import android.view.View.OnClickListener;
public abstract class OnDoubleClickListener implements OnClickListener {
private long DELAY_TIME = 900;
private static long lastClickTime;
private boolean isFastDoubleClick() {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (0 < timeD && timeD < DELAY_TIME) {
return true;
}
lastClickTime = time;
return false;
}
@Override
public void onClick(View v) {
if (isFastDoubleClick()) {
onFastClick(v);
}
}
public abstract void onFastClick(View v);
}
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.view.View;
import android.view.View.OnClickListener;
public abstract class OnNetworkClickListener implements OnClickListener {
@Override
public void onClick(View v) {
boolean isNetworkOk = isNetworkConnected(v.getContext());
if (isNetworkOk) {
onNetworkClick(v);
} else {
onNoNetworkClick(v);
}
}
//有网络
public abstract void onNetworkClick(View v);
//没有网络
public abstract void onNoNetworkClick(View v);
/**
* 网络连接是否正常
*
* @param context
* @return
*/
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
}
4.定制个性化的点击事件
import android.view.View;
import android.view.View.OnClickListener;
public abstract class OnMyClickListener implements OnClickListener {
private boolean isRight;
@Override
public void onClick(View v) {
isRight = isLeftOrRight();
if(isRight){
doRight(v);
}else{
doLeft(v);
}
}
public abstract boolean isLeftOrRight();
public abstract void doLeft(View v);
public abstract void doRight(View v);
}
MainActivity.java
private Button btn1,btn2,btn3,btn4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupView();
}
private void setupView() {
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
btn4 = (Button) findViewById(R.id.btn4);
//防止快速点击触发多次的按钮
btn1.setOnClickListener(new OnFastClickListener() {
@Override
public void onFastClick(View v) {
Toast.makeText(MainActivity.this, "快速点击按钮被点击", Toast.LENGTH_SHORT).show();
}
});
//监听双击的按钮
btn2.setOnClickListener(new OnDoubleClickListener() {
@Override
public void onFastClick(View v) {
Toast.makeText(MainActivity.this, "按钮双击事件触发", Toast.LENGTH_SHORT).show();
}
});
//检测网络情况的按钮
btn3.setOnClickListener(new OnNetworkClickListener() {
@Override
public void onNoNetworkClick(View v) {
Toast.makeText(MainActivity.this, "当前没有网络,请检查网络是否正常", Toast.LENGTH_SHORT).show();
}
@Override
public void onNetworkClick(View v) {
Toast.makeText(MainActivity.this, "当前网络情况正常", Toast.LENGTH_SHORT).show();
}
});
//自定义个性化事件
btn4.setOnClickListener(new OnMyClickListener() {
@Override
public boolean isLeftOrRight() {
//根据奇数月和偶数月的不同来执行,当然也可以不是2个分枝,也可以是多个分枝
Date d = new Date();
int m = d.getMonth()+1;
if(m*2 == 0) return true;
else return false;
}
@Override
public void doRight(View v) {
Toast.makeText(MainActivity.this, "当前月份是偶数月", Toast.LENGTH_SHORT).show();
}
@Override
public void doLeft(View v) {
Toast.makeText(MainActivity.this, "当前月份是奇数月", Toast.LENGTH_SHORT).show();
}
});
}
源码在这儿下载