diff --git a/corelibrary/src/main/java/com/dalimao/corelibrary/VerificationCodeInput.java b/corelibrary/src/main/java/com/dalimao/corelibrary/VerificationCodeInput.java
index 32fde4c..254cb4c 100644
--- a/corelibrary/src/main/java/com/dalimao/corelibrary/VerificationCodeInput.java
+++ b/corelibrary/src/main/java/com/dalimao/corelibrary/VerificationCodeInput.java
@@ -15,12 +15,14 @@ import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextWatcher;
+import android.text.method.PasswordTransformationMethod;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.LinearLayout;
@@ -30,17 +32,23 @@ import android.widget.LinearLayout;
public class VerificationCodeInput extends ViewGroup {
+ private final static String TYPE_NUMBER = "number";
+ private final static String TYPE_TEXT = "text";
+ private final static String TYPE_PASSWORD = "password";
+ private final static String TYPE_PHONE = "phone";
+
private static final String TAG = "VerificationCodeInput";
private int box = 4;
private int boxWidth = 120;
private int boxHeight = 120;
private int childHPadding = 14;
private int childVPadding = 14;
+ private String inputType = TYPE_PASSWORD;
private Drawable boxBgFocus = null;
private Drawable boxBgNormal = null;
- private EditText currentFocusChild;
private Listener listener;
+
public VerificationCodeInput(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.vericationCodeInput);
@@ -50,6 +58,7 @@ public class VerificationCodeInput extends ViewGroup {
childVPadding = (int) a.getDimension(R.styleable.vericationCodeInput_child_v_padding, 0);
boxBgFocus = a.getDrawable(R.styleable.vericationCodeInput_box_bg_focus);
boxBgNormal = a.getDrawable(R.styleable.vericationCodeInput_box_bg_normal);
+ inputType = a.getString(R.styleable.vericationCodeInput_inputType);
initViews();
}
@@ -77,47 +86,29 @@ public class VerificationCodeInput extends ViewGroup {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
- if (s.length() == 1) {
- EditText editText = (EditText) getChildAt((currentFocusChild.getId() + 1) % box);
- editText.requestFocus();
- }
+
+
}
@Override
public void afterTextChanged(Editable s) {
if (s.length() == 0) {
} else {
+ focus();
checkAndCommit();
}
-
}
};
- OnFocusChangeListener listener = new OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- EditText editText = (EditText)v;
- setBg(editText, hasFocus);
- if (hasFocus) {
- currentFocusChild = editText;
- }
- }
- };
OnKeyListener onKeyListener = new OnKeyListener() {
@Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
+ public synchronized boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
- EditText editText = (EditText) v;
- int id = editText.getId();
- if (id > 0) {
- EditText prEditText = (EditText) getChildAt((currentFocusChild.getId() - 1) % box);
- prEditText.requestFocus();
-
- }
+ backFocus();
}
return false;
}
@@ -133,27 +124,59 @@ public class VerificationCodeInput extends ViewGroup {
layoutParams.rightMargin = childHPadding;
layoutParams.gravity = Gravity.CENTER;
- editText.setOnFocusChangeListener(listener);
+
editText.setOnKeyListener(onKeyListener);
setBg(editText, false);
editText.setLayoutParams(layoutParams);
editText.setGravity(Gravity.CENTER);
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1)});
- editText.setInputType(InputType.TYPE_CLASS_NUMBER);
+
+ if (TYPE_NUMBER.equals(inputType)) {
+ editText.setInputType(InputType.TYPE_CLASS_NUMBER);
+ } else if (TYPE_PASSWORD.equals(inputType)){
+ editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
+ } else if (TYPE_TEXT.equals(inputType)){
+ editText.setInputType(InputType.TYPE_CLASS_TEXT);
+ } else if (TYPE_PHONE.equals(inputType)){
+ editText.setInputType(InputType.TYPE_CLASS_PHONE);
+
+ }
editText.setId(i);
editText.setEms(1);
editText.addTextChangedListener(textWatcher);
addView(editText,i);
- if (i == 0) {
- editText.requestFocus();
- currentFocusChild = editText;
- }
+
}
}
+ private void backFocus() {
+ int count = getChildCount();
+ EditText editText ;
+ for (int i = count-1; i>= 0; i--) {
+ editText = (EditText) getChildAt(i);
+ if (editText.getText().length() == 1) {
+ editText.requestFocus();
+ editText.setSelection(1);
+ return;
+ }
+ }
+ }
+
+ private void focus() {
+ int count = getChildCount();
+ EditText editText ;
+ for (int i = 0; i< count; i++) {
+ editText = (EditText) getChildAt(i);
+ if (editText.getText().length() < 1) {
+ editText.requestFocus();
+ return;
+ }
+ }
+ }
+
private void setBg(EditText editText, boolean focus) {
if (boxBgNormal != null && !focus) {
editText.setBackground(boxBgNormal);
diff --git a/corelibrary/src/main/res/values/attrs.xml b/corelibrary/src/main/res/values/attrs.xml
index faf420d..ef56b32 100644
--- a/corelibrary/src/main/res/values/attrs.xml
+++ b/corelibrary/src/main/res/values/attrs.xml
@@ -8,6 +8,7 @@
+
\ No newline at end of file
diff --git a/simple/src/main/res/layout/activity_main.xml b/simple/src/main/res/layout/activity_main.xml
index 2fa25ff..b2b3f2e 100644
--- a/simple/src/main/res/layout/activity_main.xml
+++ b/simple/src/main/res/layout/activity_main.xml
@@ -56,4 +56,21 @@
android:layout_centerInParent="true"
android:layout_marginBottom="16dp"
/>
+
+