類似支付寶支付密碼的edittext
阿新 • • 發佈:2019-01-27
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, intpwdsize) { 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); } }