1.使用枚举定义键值和对应的类型。
2.输入框可以自定义。也可以使用自定义输入框
3.通过一个集合来完成输入数据的追加和移除
看过上一篇,知道上篇留了一个尾巴,只是说明了自定义数字键盘中使用技术,并没有贴相应的代码,这篇贴上代码,做出一些必要解释
public enum KeyboardEnum {
one(ActionEnum.add, "1"),
two(ActionEnum.add, "2"),
three(ActionEnum.add, "3"),
four(ActionEnum.add, "4"),
five(ActionEnum.add, "5"),
sex(ActionEnum.add, "6"),
seven(ActionEnum.add, "7"),
eight(ActionEnum.add, "8"),
nine(ActionEnum.add, "9"),
zero(ActionEnum.add, "0"),
del(ActionEnum.delete, "del"),
longdel(ActionEnum.longClick, "longclick"),
cancel(ActionEnum.cancel, "cancel"),
sure(ActionEnum.sure, "sure");
public enum ActionEnum {
add, delete, longClick, cancel, ActionEnum, sure
}
private ActionEnum type;
private String value;
private KeyboardEnum(ActionEnum type, String value) {
this.type = type;
this.value = value;
}
public ActionEnum getType() {
return type;
}
public void setType(ActionEnum type) {
this.type = type;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
longClick, cancel, ActionEnum, sure
这些只是一些特殊处理,这里不进行扩展,会给出原文链接。其实也就是根据类型。做一些特殊处理罢了
这样看,就可以看出使用枚举类型的好处了。很清晰。数字0-9对应 追加。(字符串相加),删除操作,进行分开处理。
输入框使用的 GridPasswordView
https://github.com/Jungerr/GridPasswordView
本来准备使用这个组件,不料和交互不符合。就作为一个输入框。他里面的事件,监听,能注释的都注视了。只是作为一个输入框使用
1.拿到资源,设置监听事件,处理onclick事件
package com.nuoyuan.sp2p.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.nuoyuan.sp2p.R;
import java.util.ArrayList;
@SuppressLint("InflateParams")
public class PayKeyboardView implements View.OnClickListener, View.OnLongClickListener {
private ArrayList<String> mList = new ArrayList<String>();
private View mView;
private OnPayListener listener;
private Context mContext;
private Button btn1;
private Button btn2;
private Button btn3;
private Button btn4;
private Button btn5;
private Button btn6;
private Button btn7;
private Button btn8;
private Button btn9;
private Button btnDel;
private Button btn0;
private Button btnEnd;
private TextView[] textViews;
private FrameLayout fraBtn;
public PayKeyboardView(Context context, View view) {
this.mContext = context;
mView = view;
initView();
setOnclickLisener();
}
/**
* 初始化验证码框的值
*/
private void initVerificationCodeBoxValue() {
if (!mList.isEmpty()) {
mList.clear();
updateVerificationCodeBoxUi();
}
}
private void setOnclickLisener() {
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
btn6.setOnClickListener(this);
btn7.setOnClickListener(this);
btn8.setOnClickListener(this);
btn9.setOnClickListener(this);
btnDel.setOnClickListener(this);
btn0.setOnClickListener(this);
btnDel.setOnLongClickListener(this);
fraBtn.setOnClickListener(this);
}
private void initView() {
btn1 = (Button) mView.findViewById(R.id.btn_1);
btn2 = (Button) mView.findViewById(R.id.btn_2);
btn3 = (Button) mView.findViewById(R.id.btn_3);
btn4 = (Button) mView.findViewById(R.id.btn_4);
btn5 = (Button) mView.findViewById(R.id.btn_5);
btn6 = (Button) mView.findViewById(R.id.btn_6);
btn7 = (Button) mView.findViewById(R.id.btn_7);
btn8 = (Button) mView.findViewById(R.id.btn_8);
btn9 = (Button) mView.findViewById(R.id.btn_9);
btnDel = (Button) mView.findViewById(R.id.btn_del);
btn0 = (Button) mView.findViewById(R.id.btn_0);
btnEnd = (Button) mView.findViewById(R.id.btn_end);
fraBtn = (FrameLayout) mView.findViewById(R.id.fra_btn);
}
private void parseActionType(KeyboardEnum type) {
if (type.getType() == KeyboardEnum.ActionEnum.add) {
if (mList.size() < 6) {
mList.add(type.getValue());
updateVerificationCodeBoxUi();
}
// TODO: 2016/7/8 可以进行优化 直接返回 list
if (mList.size() == 6) { //触发支付回调
String payValue = "";
for (int i = 0; i < mList.size(); i++) {
payValue += mList.get(i);
}
listener.onSurePay(payValue);
}
} else if (type.getType() == KeyboardEnum.ActionEnum.delete) {
if (mList.size() > 0) {
mList.remove(mList.get(mList.size() - 1));
updateVerificationCodeBoxUi();
}
} else if (type.getType() == KeyboardEnum.ActionEnum.cancel) {
listener.onCancelPay();
}
// TODO: 2016/7/8 确认和长按事件禁用
// else if (type.getType() == KeyboardEnum.ActionEnum.sure) {
// if (mList.size() < 6) {
// Toast.makeText(mContext, "请输入验证码", Toast.LENGTH_SHORT).show();
// } else {
// String payValue = "";
// for (int i = 0; i < mList.size(); i++) {
// payValue += mList.get(i);
// }
// listener.onSurePay(payValue);
// }
// } else if (type.getType() == KeyboardEnum.ActionEnum.longClick) {
// mList.clear();
// updateUi();
// }
}
private void updateVerificationCodeBoxUi() {
//todo 只针对6个密码框
// for (int i = 0; i < 5; i++) {
// if (i > mList.size()) {
// textViews[i].setText("");
// } else {
// textViews[i].setText(mList.get(i));
// }
// }
if (mList.size() == 0) {
textViews[0].setText("");
textViews[1].setText("");
textViews[2].setText("");
textViews[3].setText("");
textViews[4].setText("");
textViews[5].setText("");
} else if (mList.size() == 1) {
textViews[0].setText(mList.get(0));
textViews[1].setText("");
textViews[2].setText("");
textViews[3].setText("");
textViews[4].setText("");
textViews[5].setText("");
} else if (mList.size() == 2) {
textViews[0].setText(mList.get(0));
textViews[1].setText(mList.get(1));
textViews[2].setText("");
textViews[3].setText("");
textViews[4].setText("");
textViews[5].setText("");
} else if (mList.size() == 3) {
textViews[0].setText(mList.get(0));
textViews[1].setText(mList.get(1));
textViews[2].setText(mList.get(2));
textViews[3].setText("");
textViews[4].setText("");
textViews[5].setText("");
} else if (mList.size() == 4) {
textViews[0].setText(mList.get(0));
textViews[1].setText(mList.get(1));
textViews[2].setText(mList.get(2));
textViews[3].setText(mList.get(3));
textViews[4].setText("");
textViews[5].setText("");
} else if (mList.size() == 5) {
textViews[0].setText(mList.get(0));
textViews[1].setText(mList.get(1));
textViews[2].setText(mList.get(2));
textViews[3].setText(mList.get(3));
textViews[4].setText(mList.get(4));
textViews[5].setText("");
} else if (mList.size() == 6) {
textViews[0].setText(mList.get(0));
textViews[1].setText(mList.get(1));
textViews[2].setText(mList.get(2));
textViews[3].setText(mList.get(3));
textViews[4].setText(mList.get(4));
textViews[5].setText(mList.get(5));
}
}
@Override
public void onClick(View v) {
if (v == btn0) {
parseActionType(KeyboardEnum.zero);
} else if (v == btn1) {
parseActionType(KeyboardEnum.one);
} else if (v == btn2) {
parseActionType(KeyboardEnum.two);
} else if (v == btn3) {
parseActionType(KeyboardEnum.three);
} else if (v == btn4) {
parseActionType(KeyboardEnum.four);
} else if (v == btn5) {
parseActionType(KeyboardEnum.five);
} else if (v == btn6) {
parseActionType(KeyboardEnum.sex);
} else if (v == btn7) {
parseActionType(KeyboardEnum.seven);
} else if (v == btn8) {
parseActionType(KeyboardEnum.eight);
} else if (v == btn9) {
parseActionType(KeyboardEnum.nine);
} else if (v == btnDel || v == fraBtn) {
parseActionType(KeyboardEnum.del);
}
}
/* else if (v == btnEnd) {
parseActionType(KeyboardEnum.sure);
} else if (v == btnDel ||) {
parseActionType(KeyboardEnum.cancel);
}*/
@Override
public boolean onLongClick(View v) {
parseActionType(KeyboardEnum.longdel);
return false;
}
public interface OnPayListener {
void onCancelPay();
void onSurePay(String password);
}
public View getView() {
return mView;
}
public TextView[] getmViewArr() {
return textViews;
}
public void setmViewArr(TextView[] mViewArr) {
this.textViews = mViewArr;
}
public void initVerificationCodeBox(TextView[] mViewArr) {
this.textViews = mViewArr;
initVerificationCodeBoxValue();
}
public void setPayListener(OnPayListener payListener) {
listener = payListener;
}
}