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