public class PayPwdEditText extends RelativeLayout{ private EditText editText; //文本编辑框 private Context context; private LinearLayout linearLayout; //文本密码的文本 private TextView[] textViews; //文本数组 private int pwdlength = 6; //密码长度, 默认6 private OnTextFinishListener onTextFinishListener; public PayPwdEditText(Context context) { this(context, null); } public PayPwdEditText(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PayPwdEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; } /** * @param bgdrawable 背景drawable * @param pwdlength 密码长度 * @param splilinewidth 分割线宽度 * @param splilinecolor 分割线颜色 * @param pwdcolor 密码字体颜色 * @param pwdsize 密码字体大小 */ public void initStyle(int bgdrawable, int pwdlength, float splilinewidth, int splilinecolor, int pwdcolor, int pwdsize) { this.pwdlength = pwdlength; initEdit(bgdrawable); initShowInput(bgdrawable, pwdlength, splilinewidth, splilinecolor, pwdcolor, pwdsize); } /** * 初始化编辑框 * @param bgcolor */ private void initEdit(int bgcolor) { editText = new EditText(context); editText.setBackgroundResource(bgcolor); editText.setCursorVisible(false);//选中也没有光标 editText.setTextSize(0); editText.setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD | InputType.TYPE_CLASS_NUMBER); editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(pwdlength)});//限制字数 editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Editable etext = editText.getText(); Selection.setSelection(etext, etext.length());//定位光标在最后位置 } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { initDatas(s); if(s.length() == pwdlength) { if(onTextFinishListener != null) { onTextFinishListener.onFinish(s.toString().trim()); } } } }); LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); addView(editText, lp); } /** * @param bgcolor 背景drawable * @param pwdlength 密码长度 * @param slpilinewidth 分割线宽度 * @param splilinecolor 分割线颜色 * @param pwdcolor 密码字体颜色 * @param pwdsize 密码字体大小 */ public void initShowInput(int bgcolor, int pwdlength, float slpilinewidth, int splilinecolor, int pwdcolor, int pwdsize) { //添加密码框父布局 linearLayout = new LinearLayout(context); linearLayout.setBackgroundResource(bgcolor); LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); linearLayout.setLayoutParams(layoutParams); linearLayout.setOrientation(LinearLayout.HORIZONTAL); addView(linearLayout); //添加密码框 textViews = new TextView[pwdlength]; LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LayoutParams.MATCH_PARENT); params.weight = 1; params.gravity = Gravity.CENTER; LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(dip2px(context, slpilinewidth),LayoutParams.MATCH_PARENT); for(int i = 0; i < textViews.length; i++) { final int index = i; TextView textView = new TextView(context); textView.setGravity(Gravity.CENTER); textViews[i] = textView; textViews[i].setTextSize(pwdsize); textViews[i].setTextColor(context.getResources().getColor(pwdcolor)); // 设置textview的格式为数字和密码型
textViews[i].setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_VARIATION_PASSWORD); linearLayout.addView(textView, params); if(i < textViews.length - 1) { View view = new View(context); view.setBackgroundColor(context.getResources().getColor(splilinecolor)); linearLayout.addView(view, params2); } } } /** * 是否显示明文 * @param showPwd */ public void setShowPwd(boolean showPwd) { int length = textViews.length; for(int i = 0; i < length; i++) { if (showPwd) { textViews[i].setTransformationMethod(PasswordTransformationMethod.getInstance());//密码隐式 } else { textViews[i].setTransformationMethod(HideReturnsTransformationMethod.getInstance());//密码显式 } } } /** * 设置显示类型 * @param type */ public void setInputType(int type) { int length = textViews.length; for(int i = 0; i < length; i++) { textViews[i].setInputType(type); } } /** * 清除文本框 */ public void clearText() { editText.setText(""); for(int i = 0; i < pwdlength; i++) { textViews[i].setText(""); } } public void setOnTextFinishListener(OnTextFinishListener onTextFinishListener) { this.onTextFinishListener = onTextFinishListener; } /** * 根据输入字符,显示密码个数 * @param s */ public void initDatas(Editable s) { if(s.length() > 0) { int length = s.length(); for(int i = 0; i < pwdlength; i++) { if(i < length) { for(int j = 0; j < length; j++) { char ch = s.charAt(j); textViews[j].setText(String.valueOf(ch)); } } else { textViews[i].setText(""); } } } else { for(int i = 0; i < pwdlength; i++) { textViews[i].setText(""); } } } public String getPwdText() { if(editText != null) return editText.getText().toString().trim(); return ""; } public static int dip2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } public interface OnTextFinishListener { void onFinish(String str); } }