Получить начальный индекс курсора перед изменением текста в тексте редактирования

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

 public void beforeTextChanged(CharSequence s, int start, int count, int after) {


                    selectionStart = edittext.getSelectionStart();
                    selectionEnd = edittext.getSelectionEnd();


            }

Однако и selectionStart, и selectionEnd возвращают конечный индекс выделения. Например, я выбираю слово «hello», оба возвращают 5. Я попытался вставить их в обработчик, чтобы получить выбор перед любым вводом с клавиатуры безрезультатно.


person Omar Boshra    schedule 17.07.2017    source источник


Ответы (2)


Наконец-то я нашел решение этой проблемы, оно немного уродливое, но оптимально решает проблему. Проблема заключалась в том, что перед изменением текста выделение текста уже исчезло, поэтому мне пришлось использовать обработчик, чтобы ждать, когда текст выбран, и наблюдатель диапазона, чтобы установить выбор сразу после того, как так: -

final SpanWatcher watcher = new SpanWatcher() {
@Override
public void onSpanAdded(final Spannable text, final Object what,final int start, final int end) {

final Handler handler = new Handler();//handler to get selection after 
certain time
handler.postDelayed(new Runnable() {
@Override
public void run() {

if(noteview.hasSelection()) {

higlightdetect=1;//integer to detect that text was selected

selectionStart = noteview.getSelectionStart();
selectionEnd = noteview.getSelectionEnd();

                    }else
higlightdetect=0;
                }
            }, 600);//after 600ms seemed to be the optimal time after selection occurs
        }
}

@Override
public void onSpanRemoved(final Spannable text, final Object what,
                                  final int start, final int end) {
            // Nothing here.
        }

@Override
public void onSpanChanged(final Spannable text, final Object 
what,final int ostart, final int oend, final int nstart, final int nend) 
{
//The same

final Handler handler = new Handler();//handler to get selection after 
certain time
handler.postDelayed(new Runnable() {
@Override
public void run() {

if(noteview.hasSelection()) {

higlightdetect=1;//integer to detect that text was selected

selectionStart = noteview.getSelectionStart();
selectionEnd = noteview.getSelectionEnd();

                    }else
higlightdetect=0;
                }
            }, 600);//after 600ms seemed to be the optimal time after selection occurs
        }
};


edittext.getText().setSpan(watcher, 0, edittext.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//set spanwatcher to edittext

Конечно, это работает только тогда, когда текст выделен, и его нельзя использовать для обычного набора текста, поскольку он будет автоматически обновляться сразу после изменения текста, поэтому в средстве просмотра текста я добавил этот код: -

@Override
public void beforeTextChanged(CharSequence s, int start, int 
count, int after) {



if(higlightdetect==0){//condition to get cursor position without selection

selectionStart = noteview.getSelectionStart();
selectionEnd=selectionStart;
}
public void onTextChanged(CharSequence s, int start, int before, int 
count) {

        }

@Override
public void afterTextChanged(Editable s) {

Toast.makeText(getthenote.this, String.valueOf(selectionStart), 
Toast.LENGTH_SHORT).show();
Toast.makeText(getthenote.this, String.valueOf(selectionEnd), 
Toast.LENGTH_SHORT).show();

higlightdetect=0 //resetting higlightdetect
}
person Omar Boshra    schedule 24.07.2017

Почему бы вам просто не использовать параметр start в методе beforeTextChanged?

person htafoya    schedule 09.08.2019