проблема с Android requestFocus () - PullRequest
3 голосов
/ 08 октября 2010

Ниже приведен фрагмент кода, который я написал для переноса фокуса с одного текста редактирования на другой, но проблема, с которой я столкнулся в этой реализации, заключается в том, что фокус перемещается к определенному тексту редактирования и внезапно перемещается к следующий текст для редактирования. Так что я не смог ничего ввести, так как фокус не находится на этом конкретном тексте для редактирования ..

//some code comes here
// gun_pistolNotes and gun_pistolModel are two diff. editText
......
......
    gun_pistolNotes.setOnEditorActionListener(new OnEditorActionListener(){
    @Override
    public boolean onEditorAction(TextView view,int actionId, KeyEvent event){
    if(actionId == EditorInfo.IME_ACTION_UNSPECIFIED){
        gun_pistolModel.requestFocus(); // moves to this edittext and suddenly moves to another editext 
        return true;
    }
    return false;
    }
  });

......
......
//some code comes here

Любая помощь приветствуется.

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 06 сентября 2011

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

В своем коде я понял, что по какой-то причине указание android:inputype в моем тексте редактирования вызывало такое "прыгающее" поведение. Поэтому, если у меня есть EditText1 с android:inputType="textCapSentences" в XML, вызов requestFocus() для EditText1 заставит его ненадолго высветиться, прежде чем перейти к следующему представлению.

Я не уверен, что это ошибка в Android или это действительно что-то еще, что я пропускаю. Я попытался установить inputType программно и в различных точках моего кода с помощью setInputType(), но у меня это не сработало. Итак, сейчас я только что удалил атрибут inputType и requestFocus() работает как надо.

1 голос
/ 08 сентября 2011

У меня точно такая же проблема. Я могу подтвердить утверждение Kre8 о том, что это происходит только в том случае, если задан определенный тип ввода (в моем случае textNoSuggestion / singleLine). Позже я объясню, почему это так.

Я решил проанализировать, что происходит внутри View. В конце концов, я могу сказать, что это не ошибка, возможно, несчастное созвездие :). EditText, для которого вы запросили фокус, правильно получает его.

Ваша первая, возможно, неопознанная проблема заключается в том, что EditorActionListener вызывается дважды. Один раз для ключа вверх и один раз для вниз. Я не знаю, как вы проверяли actionId, так что, возможно, ваш код не будет выполнен дважды.

Так что я неправильно позвонил в своем запросе на решение проблемы с ключевым событием ACTION_DOWN. EditText получил фокус правильно, НО на приближающемся событии ACTION_UP, которое каким-то образом интерпретируется вновь сфокусированным EditText, фокус был немедленно отправлен обратно в ранее отправленный фокус EditText, потому что он находится в поиске фокуса при следующем получении.

Так что я думаю, что теперь тип ввода оказывает влияние, потому что, если EditText находится в многострочном режиме, клавиша ввода не будет отправлять фокус дальше.

Мое окончательное рабочее решение выглядит так:

passwordEditText.setOnEditorActionListener(new OnEditorActionListener() {

  @Override
  public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && v == passwordEditText) {
      if (event.getAction() == KeyEvent.ACTION_UP) {
        if (userEditText.length() > 0 && passwordEditText.length() > 0) {
          login();
        }
        if (userEditText.length() == 0) {
          userEditText.requestFocus();
        }
      }
      return true;
    }
    return false;
  }
});

Надеюсь, это сработает и у вас:)

Edit: я забыл указать, что тип ввода EditText может быть выбран по вашему желанию, потому что метод onEditorAction обрабатывает и вверх, и вниз.

0 голосов
/ 28 ноября 2017

Я обнаружил, что это работает надежно:

        field1Text.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
            if ((i == EditorInfo.IME_ACTION_UNSPECIFIED) && (keyEvent != null) &&
                    (keyEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                    return true;
                }
                i = EditorInfo.IME_ACTION_DONE;
            }
            if (i == EditorInfo.IME_ACTION_DONE) {
                field2Text.requestFocus();
                return true;
            }
            return false;
        }
    });

Это обрабатывает как ввод с клавиатуры, так и нажатие кнопки действия на виртуальной клавиатуре.Странный провал в логике связан с тем, что я выполняю некоторые другие функции в ветке requestFocus, которые здесь опущены, поскольку они не являются частью проблемы.

0 голосов
/ 10 апреля 2012

В Android всегда была встроенная поддержка кодирования иерархии «вверх / вниз / вправо / влево» к представлениям. Это было сделано первоначально для устройств трекбола, таких как G1. Я не думаю, что вы нашли ошибку - но мы могли бы проверить, посмотрев на какой-то источник SDK. Для людей, сталкивающихся с подобной проблемой, вы можете попробовать вызвать setNext ** Focus (...) в представлении, которое необходимо «размыть», а затем сгенерировать событие, чтобы перейти к «следующему полю вниз». Это можно сделать как в XML, так и во время выполнения. Ребята, вы пробовали это?

См. View # focusSearch (int) и View # setNext ** Focus (int). SDK предполагает, что в вашем onEditorAction (...) вы могли бы написать что-то вроде:

... if (userEditText.length () == 0) { hostGameBtn.setNextFocusDownId (R.id.myUserEditTextViewID); hostGameBtn.focusSearch (View.FOCUS_DOWN); } ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...