У меня есть spanningable Textview.Я хочу показать всплывающее окно поверх выбранного промежутка внутри TextView
.как это:
![enter image description here](https://i.stack.imgur.com/sZakw.png)
мой код:
String definition = textView.getText().toString().trim();
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(definition, TextView.BufferType.SPANNABLE);
Spannable spans = (Spannable) textView.getText();
Integer[] indices = getIndices(
textView.getText().toString(), ' ');
int start = 0;
int end = 0;
for (int i = 0; i <= indices.length; i++) {
ClickableSpan clickSpan = getClickableSpan();
end = (i < indices.length ? indices[i] : spans.length());
spans.setSpan(clickSpan, start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
start = end + 1;
}
private Integer[] getIndices(String s, char c) {
int pos = s.indexOf(c, 0);
List<Integer> indices = new ArrayList<Integer>();
while (pos != -1) {
indices.add(pos);
pos = s.indexOf(c, pos + 1);
}
return (Integer[]) indices.toArray(new Integer[0]);
}
private ClickableSpan getClickableSpan() {
return new ClickableSpan() {
@SuppressLint("ClickableViewAccessibility")
@Override
public void onClick(View widget) {
TextView tv = (TextView) widget;
final String word = tv
.getText()
.subSequence(tv.getSelectionStart(),
tv.getSelectionEnd()).toString();
tv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
popup(word, (int) event.getRawX(), (int) event.getRawY());
return false;
}
});
}
};
}
какВы видите, что код изображения работает, но из-за того, что onTouch
вызывается раньше onClick
в Android, всплывающее окно показывает слово, которое щелкнуло в предыдущем шаге.извините за майский плохой английский.