自定义六位输入栏可支持粘贴
效果图:
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/ll_code"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="7dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_code1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="center"
android:maxLength="1"
android:textColor="#2D2D2D"
android:textSize="40sp" />
<View
android:id="@+id/v1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#3F8EED" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_code2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="center"
android:maxLength="1"
android:textColor="#2D2D2D"
android:textSize="40sp" />
<View
android:id="@+id/v2"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#999999" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_code3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="center"
android:maxLength="1"
android:textColor="#2D2D2D"
android:textSize="40sp" />
<View
android:id="@+id/v3"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#999999" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_code4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="center"
android:maxLength="1"
android:textColor="#2D2D2D"
android:textSize="40sp" />
<View
android:id="@+id/v4"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#999999" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="7dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_code5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="center"
android:maxLength="1"
android:textColor="#2D2D2D"
android:textSize="40sp" />
<View
android:id="@+id/v5"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#999999" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_code6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="center"
android:maxLength="1"
android:textColor="#2D2D2D"
android:textSize="40sp" />
<View
android:id="@+id/v6"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#999999" />
</LinearLayout>
</LinearLayout>
<EditText
android:id="@+id/et_code"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignTop="@+id/ll_code"
android:layout_alignBottom="@+id/ll_code"
android:background="@android:color/transparent"
android:inputType="number"
android:maxLength="6"
android:textColor="@color/red"
android:textCursorDrawable="@null" />
</RelativeLayout>
View
public class InputBoxView extends RelativeLayout {
/**
* 验证码长度
*/
private int maxCodeLength = 6;
private Context context;
private InputMethodManager imm;
private TextView tv_code1;
private TextView tv_code2;
private TextView tv_code3;
private TextView tv_code4;
private TextView tv_code5;
private TextView tv_code6;
private EditText et_code;
private View v1;
private View v2;
private View v3;
private View v4;
private View v5;
private View v6;
private List<String> codes = new ArrayList<>();
public InputBoxView(Context context) {
super(context);
this.context = context;
loadView();
}
public InputBoxView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
loadView();
}
private void loadView() {
imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
View view = LayoutInflater.from(context).inflate(R.layout.view_inputbox, this);
initView(view);
initEvent();
}
private void initView(View view) {
tv_code1 = (TextView) view.findViewById(R.id.tv_code1);
tv_code2 = (TextView) view.findViewById(R.id.tv_code2);
tv_code3 = (TextView) view.findViewById(R.id.tv_code3);
tv_code4 = (TextView) view.findViewById(R.id.tv_code4);
tv_code5 = (TextView) view.findViewById(R.id.tv_code5);
tv_code6 = (TextView) view.findViewById(R.id.tv_code6);
et_code = (EditText) view.findViewById(R.id.et_code);
v1 = view.findViewById(R.id.v1);
v2 = view.findViewById(R.id.v2);
v3 = view.findViewById(R.id.v3);
v4 = view.findViewById(R.id.v4);
v5 = view.findViewById(R.id.v5);
v6 = view.findViewById(R.id.v6);
}
private void initEvent() {
//验证码输入
et_code.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
try {
//有录入内容
if (editable != null && editable.length() > 0) {
//未超出长度
if (codes != null && codes.size() < maxCodeLength) {
setData(editable);
}
//清空已有的录入
et_code.setText("");
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
// 监听验证码删除按键
et_code.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
try {
//删除录入内容
if (keyCode == KeyEvent.KEYCODE_DEL && keyEvent.getAction() == KeyEvent.ACTION_DOWN && codes.size() > 0) {
codes.remove(codes.size() - 1);
showCode();
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
});
}
private void setData(Editable editable) {
String text = editable.toString();
//录入内容往后添加,但是不能超出长度
for (int i = 0; i < text.length() && codes.size() < maxCodeLength; i++) {
codes.add(String.valueOf(text.charAt(i)));
showCode();
}
}
/**
* 显示输入的验证码
*/
private void showCode() {
String code1 = "";
String code2 = "";
String code3 = "";
String code4 = "";
String code5 = "";
String code6 = "";
if (codes.size() >= 1) {
code1 = codes.get(0);
}
if (codes.size() >= 2) {
code2 = codes.get(1);
}
if (codes.size() >= 3) {
code3 = codes.get(2);
}
if (codes.size() >= 4) {
code4 = codes.get(3);
}
if (codes.size() >= 5) {
code5 = codes.get(4);
}
if (codes.size() >= 6) {
code6 = codes.get(5);
}
tv_code1.setText(code1);
tv_code2.setText(code2);
tv_code3.setText(code3);
tv_code4.setText(code4);
tv_code5.setText(code5);
tv_code6.setText(code6);
setColor();//设置高亮颜色
callBack();//回调
}
/**
* 设置高亮颜色
*/
private void setColor() {
int color_default = Color.parseColor("#999999");
int color_focus = Color.parseColor("#3F8EED");
v1.setBackgroundColor(color_default);
v2.setBackgroundColor(color_default);
v3.setBackgroundColor(color_default);
v4.setBackgroundColor(color_default);
v5.setBackgroundColor(color_default);
v6.setBackgroundColor(color_default);
if (codes.size() == 0) {
v1.setBackgroundColor(color_focus);
}
if (codes.size() == 1) {
v2.setBackgroundColor(color_focus);
}
if (codes.size() == 2) {
v3.setBackgroundColor(color_focus);
}
if (codes.size() == 3) {
v4.setBackgroundColor(color_focus);
}
if (codes.size() == 4) {
v5.setBackgroundColor(color_focus);
}
if (codes.size() >= 5) {
v6.setBackgroundColor(color_focus);
}
}
/**
* 回调
*/
private void callBack() {
if (onInputListener == null) {
return;
}
if (codes.size() >= maxCodeLength) {
onInputListener.onSucess(getPhoneCode());
} else {
onInputListener.onInput();
}
}
//定义回调
public interface OnInputListener {
void onSucess(String code);
void onInput();
}
private OnInputListener onInputListener;
public void setOnInputListener(OnInputListener onInputListener) {
this.onInputListener = onInputListener;
}
/**
* 清空验证码
*/
public void clear() {
if (codes != null) {
codes.clear();
tv_code1.setText(null);
tv_code2.setText(null);
tv_code3.setText(null);
tv_code4.setText(null);
tv_code5.setText(null);
tv_code6.setText(null);
}
}
/**
* 显示键盘
*/
public void showSoftInput() {
//显示软键盘
if (imm != null && et_code != null) {
et_code.setFocusable(true);
et_code.setFocusableInTouchMode(true);
et_code.requestFocus();
et_code.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager inputManager = (InputMethodManager) et_code.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(et_code, 0);
}
}, 200);
}
}
/**
* 获得手机号验证码
*
* @return 验证码
*/
public String getPhoneCode() {
StringBuilder sb = new StringBuilder();
for (String code : codes) {
sb.append(code);
}
return sb.toString();
}
}
代码实现
//显示键盘
v_inputbox.showSoftInput();
//监听
v_inputbox.setOnInputListener(new InputBoxView.OnInputListener() {
//获取输入验证码
@Override
public void onSucess(String code) {
}
@Override
public void onInput() {
}
});
//清除验证码
v_inputbox.clear();
完!!