安卓 获取TextView手指点击所在位置的文字
TextView tv;
public final static String HTML_TEXT =
"<p>\t\t\t\t你知道现在你知道现在你知道现在你知道现在你知道现在你知道现在你知道现在你知道现在你知道现在你知道现在你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p>";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
tv.setText(Html.fromHtml(this, HTML_TEXT));
SpannableStringBuilder s = new SpannableStringBuilder(tv.getText());
for(int i=0;i<s.length();i++){
ForegroundColorSpan bkSpan = new ForegroundColorSpan(Color.BLACK);
s.setSpan(bkSpan, 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
}
},i,i+1, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
tv.setText(s,TextView.BufferType.SPANNABLE);
//启用上面为每个字绑定的ClickableSpan
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) v;
int start = 0;
int end = 0;
int left = tv.getSelectionStart() - 1;
int right = tv.getSelectionEnd() + 1;
String string = tv.getText().toString();
while (left >= 0) {
String s = tv
.getText()
.subSequence(left,
left+1).toString();
if (s.equals("!") || s.equals("?")) {
break;
}else{
left-=1;
}
}
while (right < string.length()) {
String s = tv
.getText()
.subSequence(right-1,
right).toString();
if (s.equals("!") || s.equals("?")) {
break;
}else{
right+=1;
}
}
start = left + 1;
end = right;
String s = tv
.getText()
.subSequence(start,
end).toString();
tv.setText(StyleHtml.fromHtml(MainActivity.this, HTML_TEXT));
SpannableStringBuilder builder = new SpannableStringBuilder(tv.getText().toString());
//ForegroundColorSpan 为文字前景色,BackgroundColorSpan为文字背景色
ForegroundColorSpan redSpan = new ForegroundColorSpan(Color.WHITE);
ForegroundColorSpan bkSpan = new ForegroundColorSpan(Color.BLACK);
BackgroundColorSpan redSpanBg = new BackgroundColorSpan(Color.RED);
//
builder.setSpan(bkSpan, 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(redSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(redSpanBg, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
for(int i=0;i<builder.length();i++){
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
}
},i,i+1, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
tv.setText(builder);
Log.d("tapped on:", s);
}
});
}