Java 在Android中更改范围内的文本时删除范围
假设我这样评论:Java 在Android中更改范围内的文本时删除范围,java,android,html,Java,Android,Html,假设我这样评论: 嗨,安德里亚,看看这个。。。。。在这篇评论中,我想强调Andrea,但每当我更改Andrea的值或删除单词中的一个字符时,span就会改变,问题是我使用的是spannableString.setSpan(新样式span(Typeface.BOLD)、indexOfAt、highlightName.length()+indexOfAt、span.span_EXCLUSIVE),SuxObjaveSuviv.Auxor 在中间接受单词和删除单词,当用户改变单词或删除单词的字符时,如
嗨,安德里亚,看看这个。。。。。在这篇评论中,我想强调Andrea,但每当我更改Andrea的值或删除单词中的一个字符时,span就会改变,问题是我使用的是
spannableString.setSpan(新样式span(Typeface.BOLD)、indexOfAt、highlightName.length()+indexOfAt、span.span_EXCLUSIVE)
,SuxObjaveSuviv.Auxor <代码>在中间接受单词和删除单词,当用户改变单词或删除单词的字符时,如何删除跨度? < P>你可以试试TextWatcher,只需将Twitter添加到你想在上面和在中实现的文本视图中。
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Do some magic here
}
现在,每当用户键入或删除任何字符时,您都会收到一个回调,在收到该回调后,您可以重置span。如果您使用的是
SpannableString
,您必须在每次更改时重新创建整个内容
您可以删除跨距,但不能更改源(注释),因为SpannableString
源文本是不可变的
我建议您在每次更改注释时创建SpannableString
,查找名称并标记它们,然后如果注释发生更改,则使用新的SpannableString
重复相同的操作。不会有性能问题,因为注释的大小很小
如果您想拥有一个可变对象,可以使用
SpannableStringBuilder
,但它更复杂,不需要它。您需要注意编辑文本上的文本更改。
假设您使用的EditText
,命名为commentEditText
commentEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
String comment = editable.toString();
if (comment.indexOf('@') != -1) {
//Asumming the name string
String name = "Andrea";
int atIndex = comment.indexOf('@');
int endIndex = atIndex + name.length() + 1;
if (endIndex == -1 || endIndex > editable.length()) {
endIndex = editable.length();
}
if (comment.toLowerCase().contains(name.toLowerCase())) {
editable.setSpan(new StyleSpan(Typeface.BOLD), atIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
StyleSpan[] spannable = editable.getSpans(atIndex, endIndex, StyleSpan.class);
if (spannable != null && spannable.length > 0) {
for (int i = 0; i < spannable.length; i++) {
editable.removeSpan(spannable[i]);
}
}
}
}
}
});
commentEditText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i1,int i2){
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i1,int i2){
}
@凌驾
public void PostTextChanged(可编辑){
字符串注释=可编辑的.toString();
if(comment.indexOf('@')!=-1){
//Asumming名称字符串
String name=“Andrea”;
int atIndex=comment.indexOf('@');
int endIndex=atIndex+name.length()+1;
如果(endIndex==-1 | | endIndex>editable.length()){
endIndex=editable.length();
}
if(comment.toLowerCase().contains(name.toLowerCase())){
可编辑的.setSpan(新样式SPAN(Typeface.BOLD)、atIndex、endIndex、SPAN.SPAN_EXCLUSIVE_EXCLUSIVE);
}否则{
StyleSpan[]spannable=editable.getspan(atIndex,endIndex,StyleSpan.class);
如果(spannable!=null&&spannable.length>0){
对于(int i=0;i
解释了基本思想是获得文本更改的回调,这在这里实现。小提琴或代码将有助于回答这一问题。