requestFocus не меняет фокус при использовании getCurrentFocus - PullRequest
0 голосов
/ 06 октября 2018

Я делаю OTP Activity и мне нужно реализовать функцию удаления, у меня есть функция ниже, которая должна быть запущена onKey вверх по кнопке возврата.Я думаю, что я мог бы использовать getCurrentFocus, чтобы узнать, какие поля в настоящее время заполняются, а затем использовать requestFocus, чтобы выбрать предыдущее, но, похоже, это не работает, у меня есть другая функция для goToNext, которая прекрасно работает, поэтому я запутался, почему.

enter image description here

 public void goToPrevious() {
    EditText currentFocus = (EditText) getCurrentFocus();


    if (currentFocus == otpOne) {
        return;
    }

    if (currentFocus == otpTwo) {
        otpOne.requestFocus();

        return;
    }

    if (currentFocus == otpThree) {
        otpTwo.requestFocus();

        return;
    }

    if (currentFocus == otpFour) {
        otpThree.requestFocus();

        return;
    }
}

Ниже приведен код для goToNext, который отлично работает.

public void goToNext() {
    EditText currentFocus = (EditText) getCurrentFocus();

    if (currentFocus == otpOne) {
        otpTwo.requestFocus();

        return;
    }

    if (currentFocus == otpTwo) {
        otpThree.requestFocus();

        return;
    }

    if (currentFocus == otpThree) {
        otpFour.requestFocus();

        return;
    }

    if (currentFocus == otpFour) {
        return;
    }
}

Я вызываю goToPrevious путем реализации onKeyListener, ниже приведен код

 @Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    EditText currentFocus = (EditText) getCurrentFocus();
    Log.i("ENOUGH", "onKey: " + keyCode + " " + event.getAction() + " " + KeyEvent.KEYCODE_DEL);
    switch (event.getKeyCode()) {
        case KeyEvent.KEYCODE_DEL: {
            currentFocus.setText(null);
            goToPrevious();
            return false;
        }
    }
    return false;
}

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Я должен исправить это, передав значение getCurrentFocus непосредственно в goToPrevious, по какой-то очень странной причине, значение getCurrentFocus внутри обработчика onKey отличается от goToPrevious, ниже приведен код Iв конечном итоге.

public void goToNext(EditText currentFocus) {

    if (currentFocus == otpOne) {
        otpTwo.requestFocus();

        return;
    }

    if (currentFocus == otpTwo) {
        otpThree.requestFocus();

        return;
    }

    if (currentFocus == otpThree) {
        otpFour.requestFocus();

        return;
    }

    if (currentFocus == otpFour) {
        return;
    }
}

public void goToPrevious(EditText currentFocus) {

    if (currentFocus == otpOne) {
        return;
    }

    if (currentFocus == otpTwo) {
        otpOne.requestFocus();

        return;
    }

    if (currentFocus == otpThree) {
        otpTwo.requestFocus();

        return;
    }

    if (currentFocus == otpFour) {
        otpThree.requestFocus();

        return;
    }
}


@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    Log.i("ENOUGH", "onKey: " + keyCode + " " + event.getAction() + " " + KeyEvent.KEYCODE_DEL);
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        EditText currentFocus = (EditText) getCurrentFocus();
        switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_DEL: {
                if (currentFocus.getText().length() > 0) {
                    currentFocus.setText(null);
                } else {
                    goToPrevious(currentFocus);

                    EditText focused = (EditText) getCurrentFocus();
                    focused.setText(null);
                }

                return false;
            }
            case KeyEvent.KEYCODE_FORWARD:
                return true;
            case KeyEvent.KEYCODE_BACK:
                return true;
            case KeyEvent.KEYCODE_ENTER:
                return true;
            default: {
                currentFocus.setText("");
                goToNext(currentFocus);
            }
        }
    }
    return false;
}
0 голосов
/ 06 октября 2018

Вы можете использовать так:

et1.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(s.length()==1)
                    {
                        et2.requestFocus();
                    }
                    else if(s.length()==0)
                    {
                        et1.clearFocus();
                    }
                }
            });

            et2.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(s.length()==1)
                    {
                        et3.requestFocus();
                    }
                    else if(s.length()==0)
                    {
                        et1.requestFocus();
                    }
                }
            });

            et3.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(s.length()==1)
                    {
                        et4.requestFocus();
                    }
                    else if(s.length()==0)
                    {
                        et2.requestFocus();
                    }
                }
            });

            et4.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(s.length()==1)
                    {
                        et5.requestFocus();
                    }
                    else if(s.length()==0)
                    {
                        et3.requestFocus();
                    }
                }
            });

            et5.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(s.length()==1)
                    {
                        et6.requestFocus();
                    }
                    else if(s.length()==0)
                    {
                        et4.requestFocus();
                    }
                }
            });

            et6.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if(s.length()==1)
                    {
                        et6.clearFocus();
                    }
                    else if(s.length()==0)
                    {
                        et5.requestFocus();
                    }
                }
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...