2016-06-27 10 views
1

Я использовал BackgroundColorSpan, чтобы выделить какой-либо текст TextView с помощью последующих строк кодаBackgroundColorSpan скрывает цвет текста выбора андроида

SpannableString text = new SpannableString(textView.getText()); 
text.setSpan(new BackgroundColorSpan(Color.YELLOW),start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE); 
textView.setText(text, TextView.BufferType.SPANNABLE); 

, но когда я выбираю те, текст BackgroundColorSpan скрывает цвет выделения текста как показано на скриншоте. Я хочу, чтобы цвет выделения текста отображался поверх BackgroundColorSpan. Любое решение?

enter image description here

ответ

0

Поскольку SpannableString оказывают TextView и выделение текста контролируются контекстной ActionMode, я не думаю, что есть простой способ, чтобы заставить их работать вместе. Однако есть обходной путь.

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

textView.setCustomSelectionActionModeCallback(new ActionMode.Callback() { 
    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     return true; 
    } 
    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     // 
     // This function is called whenever the selected text is 
     // changed, so you can use this to keep track of which part 
     // the text is currently selected 
     // 
     int start = textView.getSelectionStart(); 
     int end = textView.getSelectionEnd(); 
     String slectedText =textView.getText().toString().substring(start, end)); 
     return true; 
    } 
    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     return false; 
    } 
    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
    } 
}); 

Вторая часть решения заключается в вычислении пересечение между выбранным текстом и текстом в данный момент выделено SpannableString, а не для выделения пересекаемой части. Поскольку вам может потребоваться изменить это во время выполнения, вы можете использовать SpannableStringBuilder.

+0

Спасибо за ваш ответ .. но я точно хочу, чтобы цвет выбора текста, который имеет непрозрачность, накладывается на BackgroundColorSpan, чтобы оба цвета были видны. –

+1

В этом случае вы можете использовать ** Color.argb (int alpha, int red, int green, int blue) ** для замены ** Color.YELLOW ** в ** новом BackgroundColorSpan (Color.YELLOW) **. Первый ** ** ** термин даст вам прозрачность (0-255). – solosodium