textView.getSelectionEnd () возвращает значение начального индекса на устройствах Samsung Marshmallow 6.0

Эта проблема наблюдается только на устройствах Samsung с Android 6.0 . Он отлично работает на всех других устройствах, включая устройства не-Samsung с Android 6.0 и Samsung с Android 5.1 и ниже.

В настоящее время у нас нет устройства Samsung с Android 6.0 для быстрой проверки на нем, но мы скоро организуем это.


Функция, в которой мы используем это:

Пользователь долго нажимает на слово из предложения в TextView, а затем пользователь может редактировать выбранное слово.


Мы выполняем это следующим образом:

  • Делаем TextView выбираемым и добавляем LongClickListener.
  • Добавление пользовательского режима действия выбора CallBack и переопределение onCreateActionMode () для возврата false, поскольку нам не нужен стандартный режим действия «вырезать-копировать-вставить».
  • Обработка onLongClickListener для получения точного выбранного слова и предоставления пользовательского интерфейса для исправления и замены слова.

Проблема, с которой мы сталкиваемся:

textView.getSelectionStart () возвращает правильный начальный индекс, но textView.getSelectionEnd () возвращает значение начального индекса вместо конечного индекса. У нас есть условие защиты, что всякий раз, когда начальный и конечный индексы совпадают, выбор делается для пробела, и поэтому мы его игнорируем, поэтому все выборки слов на устройствах Samsung с Android 6.0 и выше игнорируются, что приводит к сбою функции.


Мы попробовали:

  • Мы попытались заменить ActionMode.Callback на ActionMode.Callback2 , как упоминалось в разделе «Выбор текста». на странице Изменения в Android 6.0 , но это не помогло решить эту проблему.
  • Попытка поиска любых дополнительных настроек Samsung, связанных с выделением текста, буфера обмена и т. Д., Но не повезло. Я знаю, что это может быть неудачным вариантом, но я не рискую с Samsung Touchwiz. Я нашел настройку, чтобы изменить задержку для выбора касания в диапазоне от 0,5 до 2,0 секунд.

Фрагменты кода:

tvText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false; // true = create the ActionMode
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
        }
    });

    tvText.setOnLongClickListener(new View.OnLongClickListener() { 

        @Override
        public boolean onLongClick(View v) {

            final TextView textView = (TextView) v;
            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {

                    //This works correct on all devices with Android 6.0
                    int startIndex = textView.getSelectionStart();

                    //This works wrong on Samsung devices with Android 6.0, result is same as getSelectionStart()
                    int endIndex = textView.getSelectionEnd();

                    //The guard condition where we ignore the empty selections
                    if ((endIndex - startIndex) <= 0) {
                        return;
                    }

                    // Do bunch of things to UI like applying some different foreground colors to the selected word, striking out selected word etc.
                }
            }, TEXT_LONG_PRESS_DELAY);
            return false;
        }
    }); 

XML-код для TextView и его стиль: