There are 3 fields. when field No. 1 is filled, the focus jumps to field No. 2. you need to click on the backspace (or enter but then wipe all the characters) in the number 2 focus jumped back to the field №1
import android.graphics.Color; import android.graphics.PorterDuff; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.widget.Button; import android.widget.EditText; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; public class MainActivity extends AppCompatActivity { private EditText et1, et2, et3; private int g; // create a textWatcher member private TextWatcher mTextWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable editable) { checkFieldsForEmptyValues(); } }; private GoogleApiClient client; void checkFieldsForEmptyValues() { Button b = (Button) findViewById(R.id.button); String s1 = et1.getText().toString(); String s2 = et2.getText().toString(); String s3 = et3.getText().toString(); if (s1.length() == 19 && s2.length() == 5 && s3.length() == 3) { b.setEnabled(true); } else { b.setEnabled(false); } } public static boolean lunaCheck(String ccNumber) {//luna algoritm int sum = 0; String ccNumberFormatInt = ccNumber.replaceAll(" ", ""); boolean alternate = false; for (int i = ccNumberFormatInt.length() - 1; i >= 0; i--) { int n = Integer.parseInt(ccNumberFormatInt.substring(i, i + 1)); if (alternate) { n *= 2; if (n > 9) { n = (n % 10) + 1; } } sum += n; alternate = !alternate; } return (sum % 10 == 0); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et1 = (EditText) findViewById(R.id.editTextCardNumber); et2 = (EditText) findViewById(R.id.editTextValidity); et3 = (EditText) findViewById(R.id.editTextCVV); et1.addTextChangedListener(mTextWatcher); et2.addTextChangedListener(mTextWatcher); et3.addTextChangedListener(mTextWatcher); checkFieldsForEmptyValues(); final EditText editTextCardNumber = (EditText) findViewById(R.id.editTextCardNumber); final EditText editTextValidity = (EditText) findViewById(R.id.editTextValidity); final EditText editTextCVV = (EditText) findViewById(R.id.editTextCVV); editTextCardNumber.addTextChangedListener(new TextWatcher() {//поле №1 int mCountBefore; int mCountAfter; int mStartNumber; public static final char SPACING_CHAR = '-'; private static final String EMPTY_STRING = ""; private static final String WHITE_SPACE = " "; private String lastSource = EMPTY_STRING; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { mCountBefore = count; } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mCountAfter = count; mStartNumber = start; } @Override public void afterTextChanged(Editable s) {//cardnumber String source = s.toString(); if (!lastSource.equals(source)) { source = source.replace(WHITE_SPACE, EMPTY_STRING); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < source.length(); i++) { if (i > 0 && i % 4 == 0) { stringBuilder.append(WHITE_SPACE); } stringBuilder.append(source.charAt(i)); } lastSource = stringBuilder.toString(); s.replace(0, s.length(), lastSource); if (s.length()==19 && !lunaCheck(String.valueOf(s))) { editTextCardNumber.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP); }else if (s.length()==19 && lunaCheck(String.valueOf(s))) { editTextValidity.requestFocus(); editTextCardNumber.getBackground().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN); } } } }); editTextValidity.addTextChangedListener(new TextWatcher() {//поле №2 int mCountBefore; int mCountAfter; int mStartNumber; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { mCountBefore = count; } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mCountAfter = count; mStartNumber = start; } @Override public void afterTextChanged(Editable s) { if (mCountAfter > mCountBefore && mStartNumber == 0) { if(s.toString().equals("0")|s.toString().equals("1")){ } else { System.out.println(s.toString()); editTextValidity.removeTextChangedListener(this); editTextValidity.setText("0" + s+"/"); editTextValidity.addTextChangedListener(this); editTextValidity.setSelection(3); } } if (mCountAfter > mCountBefore && mStartNumber == 1) { if(s.toString().equals("01")|s.toString().equals("02")|s.toString().equals("03")|s.toString().equals("04")|s.toString().equals("05")|s.toString().equals("06")|s.toString().equals("07")|s.toString().equals("08")|s.toString().equals("09")|s.toString().equals("10")|s.toString().equals("11")|s.toString().equals("12")){ s.append("/"); } else{ s.delete(s.length()-1, s.length()); } } else if (mCountAfter < mCountBefore && mStartNumber == 2) { s.delete(s.length()-1, s.length()); } if (s.length() == 6) { s.delete(s.length()-1, s.length()); editTextCVV.requestFocus(); } } }); editTextCVV.addTextChangedListener(new TextWatcher() {//edit text for CVV int mCountBefore; int mCountAfter; int mStartNumber; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { mCountBefore = count; } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mCountAfter = count; mStartNumber = start; } @Override public void afterTextChanged(Editable s) { if (s.length() == 4) { s.delete(s.length() - 1, s.length()); } } }); client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); } }