Долгое нажатие прервано для EditText (или android.support.v7.widget.AppCompatEditText) после перезапуска представления в RecyclerView. - PullRequest
0 голосов
/ 22 февраля 2019

Сводка об ошибках

После того, как EditText перерабатывается в RecyclerView, его поведение при длительном нажатии, которое используется для выделения всего текста и отображения контекстного меню «Вырезать / Копировать / Вставить», больше не работает какожидается.

Эта проблема возникает с Android 15 до Android 28.

Я пробовал EditText и android.support.v7.widget.AppCompatEditText.Обе проблемы приводят к одной и той же проблеме.

Я могу подтвердить, что эта проблема возникает после переработки View.Если применить setIsRecyclable(false); в ViewHolder, проблема не возникнет.


Шаги для воспроизведения

  1. Длительное нажатие на 1-е EditText.Мы можем подтвердить, что будет выбран весь текст в EditText.Появится контекстное меню.
  2. Прокрутка RecyclerView до конца списка.
  3. Прокрутка RecyclerView до начала списка.
  4. Длительное нажатие на 1-й EditText.Весь текст в EditText НЕ будет выделен.Контекстное меню НЕ будет отображаться.

Ожидаемое поведение

После того, как представление было переработано, мы ожидаем, что шаг 4 будет по-прежнему вести себя точно так же, как шаг 1.


Исходный код

https://github.com/yccheok/edittext_bug_in_android9


Система отслеживания ошибок

https://issuetracker.google.com/issues/125425940


Мне было интересно,кто-нибудь сталкивался с такой же проблемой, как я?У вас есть хороший способ обойти это?Обратите внимание, что мой RecyclerView предмет может быть переработан.Следовательно, использование setIsRecyclable(false); не вариант для меня.

1 Ответ

0 голосов
/ 23 февраля 2019

Короче говоря, проблема возникает из-за того, что EditText не выполняет Editor#prepareCursorControllers во время attachToWindow.

Поскольку Editor#prepareCursorControllers не является общедоступной функцией, мы можем вызвать ее косвенно, используя setCursorVisible.

edtImgDesc.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
     @Override
     public void onViewAttachedToWindow(View v) {
         edtImgDesc.setCursorVisible(false);
         edtImgDesc.setCursorVisible(true);
     }

     @Override
     public void onViewDetachedFromWindow(View v) {
     }
 });

Справочный источник: https://www.jianshu.com/p/e334134a4ef7 (блог на китайском языке)

...