1.先说第一个功能,银行卡每输四位加空格
1)我们要实现这个功能就需要去监听editText的输入,如下:
edit_view.addTextChangedListener(),此方法用于监听editText的输入,每输入一个字符此方法就会被调用,此监听事件有三个要实现的方法,如下:
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
这三个方法的执行顺序也是按照这三个方法的排列顺序来执行的,而我们逻辑处理的方法要放在onTextChanged()方法中去执行,至于为什么就不多说了,如果你们有时间就去自己试试吧,将逻辑代码放到其他方法中;
下面来看逻辑处理的代码:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
int length = edit_view.getText().length();
if (count == 1) {
if (length == 4) {
setLocation(length);
} else if (length == 9) {
setLocation(length);
} else if (length == 14) {
setLocation(length);
} else if (length == 19) {
setLocation(length);
}
}
我们来解释一下这段代码,count==1表示是字符在增加的操作(也就是输入的操作),既然是每四位加一个空格,那么当length == 4 、9、14、19是要在其后面加空格的,这里的9、14、19是吧空格也算进去的长度,这应该好理解,下面看一下加空格的操作。
private void setLocation(int length) {
String str = edit_view.getText().toString();
edit_view.setText(str + " ");
Editable editable = edit_view.getText();
//关键在这里,加完空格后要将光标移动到加完空格之后的位置
Selection.setSelection(editable, length + 1);
}
效果图如下(手机截的图,有点大抱歉啊):
到这里银行卡号每输四位加空格就已经搞定了,下面是第二个功能,一般情况下这两个功能都是放在一起使用的。
这个功能也是我在其他博客看到的,下面是原文链接:
http://blog.csdn.net/u013334392/article/details/52511743
银行卡的识别是根据银行卡号的前六位来识别的被称为bin号,想要识别银行卡号那么你就得有一个由很多bin号及bin号所对应的银行所构成的文本文档,数据库或其他什么东西,在输入完银行卡前六位后可以从这些东西当中获取相应的银行,我这里有一个文本文档存储了bin号所及其所对应的银行,下面是下载链接,你要将这个文本文档放到你的assets目录下。
bin号及其所对应银行文档的下载地址:http://download.csdn.net/detail/zhanglei280/9673851
代码如下:
/**
* Created by zhanglei on 2016/11/5.
* 根据银行卡前六位获取此卡号所对应的银行
*/
public class FindBankInfo {
//该方法用于打开assets中的binNum文档资源,获得里面的binNum数据
private static String openBinNum(Context context) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
String str = null;
try {
InputStream is = context.getResources().getAssets().open("binNum.txt");
byte[] bytes = new byte[1024];
int length = 0;
while ((length = is.read(bytes)) != -1) {
outputStream.write(bytes, 0, length);
}
is.close();
outputStream.close();
str = outputStream.toString();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
//获得Bank card的前缀
private static List<Long> getBinNum(Context context) {
String binNum = openBinNum(context);
String[] binArr = binNum.split(",");
List<Long> lon = new ArrayList<>();
for (int i = 0; i < binArr.length; i++) {
if (i % 2 == 0)
lon.add(Long.parseLong(binArr[i]));
}
return lon;
}
//获得BankName
private static List<String> getBinName(Context context) {
String binNum = openBinNum(context);
String[] binArr = binNum.split(",");
List<String> list = new ArrayList<>();
for (int i = 0; i < binArr.length; i++) {
if (i % 2 != 0) list.add(binArr[i]);
}
return list;
}
//通过输入的卡号获得银行卡信息
public static String getNameOfBank(Context context, long binNum) {
Log.e("sangfei.code", "bankBin: " + binNum);
int index = 0;
index = binarySearch(getBinNum(context), binNum);
if (index == -1) {
return "未找到..";
}
return getBinName(context).get(index) + "";
}
//数量有上千条,利用二分查找算法来进行快速查找法
public static int binarySearch(List<Long> srcArray, long des) {
int low = 0;
int high = srcArray.size() - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (des == srcArray.get(middle)) {
return middle;
} else if (des < srcArray.get(middle)) {
high = middle - 1;
} else {
low = middle + 1;
}
}
return -1;
}
}
使用方法如下:
//获取银行卡的信息
String nameOfBank = FindBankInfo.getNameOfBank(mContext, 621462);
两个功能整合在一起后的代码如下,还是在onTextChanged()方法中去处理,只是多了一个setBankName()方法:
public void onTextChanged(CharSequence s, int start, int before, int count) {
int length = number.getText().toString().length();
if (count == 1) {
if (length == 4) {
setLocation(length);
} else if (length == 9) {
setLocation(length);
} else if (length == 14) {
setLocation(length);
} else if (length == 19) {
setLocation(length);
} else if (length == 7) {
setBankName();
}
}
}
setBankName()方法如下:
/**
* 设置银行名称
*
* @author zhagnlei
* @date 16/11/5
*/
private void setBankName() {
String str = number.getText().toString();
//去空格
String replace = str.replace(" ", "");
String bankName = FindBankInfo.getNameOfBank(mActivity, new Integer(replace));
if (!bankName.equals("未找到..")) {
blank.setEnabled(true);
blank.setText(bankName);
} else {
blank.setEnabled(true);
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setMessage("未找到银行卡所对应银行,请主动输入").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
}
上面是稍微复杂的操作,提供了在没有找到所对应银行的操作,下面是简单的操作:
/**
* 设置银行名称
*
* @author zhagnlei
* @date 16/11/5
*/
private void setBankName() {
String str = number.getText().toString();
//去空格
String replace = str.replace(" ", "");
String bankName = FindBankInfo.getNameOfBank(mActivity, new Integer(replace));
blank.setText(bankName);
}
好了大工告成。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。