Подтвердить что ты не робот

RequestFocus для TextView на желе Bean slow

Я разрабатываю приложение, в котором есть 4 текстовых поля для ввода данных, и я столкнулся с проблемой производительности при перемещении фокуса с одного на другой. Когда в поле вводится символ, я использую addTextChangedListener для отслеживания текста и перемещения фокуса в следующее текстовое поле. Это отлично работает на версиях андроида до 4.1.1, но, поскольку при тестировании 4.1.1 наблюдается заметное отставание, когда вы нажимаете клавишу, прежде чем фокус появится в следующем поле. Это означает, что если пользователь быстро набирает скорость, нажатия клавиш могут быть потеряны.

У меня есть простое приложение, использующее следующий код

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    one = (EditText)findViewById(R.id.editText1);
    two = (EditText)findViewById(R.id.editText2);

    one.addTextChangedListener(new TextWatcher() {


        @Override
        public void afterTextChanged(Editable s) {
            two.requestFocus();

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }
    });
}

что подчеркивает проблему. При запуске на устройстве с 4.0.4 все в порядке, но на 4.1.1 требуется некоторое время для перемещения фокуса.

Я тестировал это на двух разных Samsung Galaxy s3 один с 4.0.4 и один с 4.1.1.

Кто-нибудь еще видел это?

Большое спасибо

Пол

4b9b3361

Ответ 1

Я не знаю, есть ли решение для этой проблемы... но у меня может быть "хак", который дает альтернативное решение, пока проблема существует:

  • Извлеките EditText из экрана. (Я обычно устанавливаю его справа от правого края с помощью RelativeLayout).

  • Установите onTouchListener в свой видимый EditText (и установите EditText, чтобы он не был доступен для клика). onTouchListener должен сосредоточиться на скрытом EditText.

  • В скрытом наборе EditText установите addTextChangedListener, который для каждого добавленного или удаляемого символа внесет правильные изменения в видимые EditTexts.

Пример:

Если у меня есть 4 EditTexts для PIN-кода с идентификаторами: A, B, C и D и EditText на экране с id hidden:

Всякий раз, когда я получаю первый char на hidden, пишу A.

Всякий раз, когда я получаю второй char на hidden, пишу B.

Всякий раз, когда я получаю удаление во втором char из hidden, я удаляю по B.

...

Я делаю что-то подобное в одном из моих приложений без проблем.