вопрос по обратным фокусам в EditText

315
19 января 2017, 03:28

Есть 3 поля. когда заполняется поле №1 фокус перескакивает на поле №2 . нужно что бы при нажатии backspace (или ввести но потом вытереть все символы )в №2 фокус перескакивал обратно в поле №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();
}

}

Answer 1

Посмотрите в сторону TextWatcher. С его помощью вы сможете отследить ситуацию, когда текст в EditText появился, а затем опять был удален.

editText.addTextChangedListener(new TextWatcher() {
    ....
});

Но TextWatcher, скорее всего, не покажет нажатие backspace в изначально пустом EditText. Его можно поймать с помощью setOnKeyListener():

editText.setOnKeyListener(new OnKeyListener() {                 
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_DEL) {  
            //this is for backspace
        }
       return false;       
    }
});

Переместить фокус на другую вьюху можно с помощью requestFocus()

READ ALSO
Почему интерфейсы упрощают жизнь?

Почему интерфейсы упрощают жизнь?

Ранее никогда не писал собственные интерфейсы для "упрощения жизни"Почему? Что в них такого интересного?

243
Передать значение ключа в массив

Передать значение ключа в массив

Доброе утроПишу функцию календаря, где есть 2 аргумента месяц и год

248
Как получить все View из ViewGroup?

Как получить все View из ViewGroup?

ЗдравствуйтеПросьба помочь с написанием первого виджета

294