Не удается получить введенный пользователем текст из Android AutoCompleteTextView после выбора элемента

У меня есть AutoCompleteTextView во фрагменте (android.support.v4.app). После того, как пользователь выберет элемент в раскрывающемся списке, я хочу сохранить введенный им текст. Вот что у меня есть.

Сначала определение класса:

public class MyFragment extends Fragment
implements
    AutoCompleteTextView.OnDismissListener,
    AutoCompleteTextView.OnKeyListener,
    AutoCompleteTextView.OnEditorActionListener {

В onViewCreated() у меня есть следующие назначения:

    myAutoComplete.setOnDismissListener(MyFragment.this);
    myAutoComplete.setOnKeyListener( MyFragment.this );
    myAutoComplete.setOnEditorActionListener(MyFragment.this);

И я добавил эти методы:

@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
    Log.i("************(arg0)  ", arg0.toString());
    Log.i("************(arg1)  ", arg0.toString());
    Log.i("***********(keyevent)  ", arg2.toString());
    return false;
}

@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
    Log.i("************(arg0)  ", arg0.toString());
    Log.i("************(arg1)  ", arg0.toString());
    Log.i("***********(keyevent)  ", arg2.toString());
    return false;
}

@Override
public void onDismiss() {
    // Fires when the dropdownlist is dismissed.
    // The event is assigned in onViewCreated
}

Моя первая надежда заключалась в том, что событие onDismiss() сработает до того, как введенный пользователем текст будет заменен выбранным элементом. Событие, как показано, срабатывает правильно, но после того, как текст пользователя был заменен выбранным элементом.

Затем я подключил два разных прослушивателя ключей, надеясь захватить и сохранить значение во время его ввода. Эти не стреляют. Изучив эту проблему, я узнал, что прослушиватели клавиш предназначены только для работы с физическими клавиатурами. Хотя некоторые люди, кажется, заставили его работать с программными kybd, широкая совместимость, похоже, является проблемой.

Так что я застрял, и у меня не осталось волос. У кого-нибудь есть предложения?


person John Ward    schedule 18.11.2016    source источник
comment
почему бы вам не попробовать TextWatcher и сохранить введенный текст во временную строку   -  person Rushi Ayyappa    schedule 18.11.2016


Ответы (1)


@Rushi Ayyappa правильно использует TextWatcher

autoCompleteTextView1.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(){
          if(isSpinnerAlreadySelected){
              autoCompleteTextView1.setEnabled(true);
              autoCompleteTextView1.performClick();
          }
      });


autoCompleteTextView1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
             if(isSpinnerAlreadySelected){
                 autoCompleteTextView1.setEnabled(false);
                 //Notify the user he cannot type and why?? Toast??
             }
        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
person marcos E.    schedule 18.11.2016
comment
@Rushi, ты был прав. beforeTextChanged() содержит желаемое значение после того, как пользователь выберет значение из раскрывающегося списка. Я новичок в Android, но я прочитал ветку, которая заставила меня подумать, что TextWatcher не будет безопасным в долгосрочной перспективе, поэтому я не исследовал ее глубже... извините, сейчас не могу найти ветку. - person John Ward; 19.11.2016
comment
Маркос, спасибо за код. Кажется, мне не нужно событие onClick или условие isSpinner..., но шаблон блока кода был очень полезен. Спасибо. - person John Ward; 19.11.2016