我已将html数据设置为textview。当我从textview中选择任何单词/字符时,我想将该单词加粗并用新的HTML数据替换原来的html数据。
String html = "<p>hello this is android testing</p>";
像这样我的html中可能有很多html标签。如果我想将“ android”一词加粗,如何用“ android”替换原始的html字符串。
我想要
<p>hello this is <strong>android</strong> testing</p>
作为结果。 最佳答案
您可以先将字符串内容设置为TextView
,然后使用setCustomSelectionActionModeCallback(...)
截取TextView中的选择。
在下面的示例中,所选单词将被<strong>...</strong>
包围。
例如,选择“测试”将使以下字符串在TextView中可见。
您好这是android测试android bla bla android bla bla android bla
然后,在已转换的TextView内容中选择“ android”上的最后一个实例,将使以下字符串在TextVIew中可见。
您好这是android测试android bla bla android bla bla android bla
代码:
public class MainActivity extends AppCompatActivity {
String yourString = "<p>hello this is android testing android bla bla android bla bla android bla</p>";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView)findViewById(R.id.opening_today);
tv.setText(Html.fromHtml(yourString));
tv.setCustomSelectionActionModeCallback(new CallbackListener(tv));
}
class CallbackListener implements ActionMode.Callback{
private TextView tv;
private String strongS = "<strong>";
private String strongE = "</strong>";
public CallbackListener(TextView tv) {
this.tv = tv;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
int start = tv.getSelectionStart();
int end = tv.getSelectionEnd();
if( start == 0 && end == 0)
return false;
String content = tv.getText().toString();
String token = content.substring(start, end);
String before = content.substring(0, start);
String after = content.substring(end, content.length());
content = makeItStrong(before, after, token);
tv.setText(Html.fromHtml(content));
return false;
}
private String makeItStrong(String before, String after, String token){
return cleanTags(before, strongS, strongE) + strongS + token + strongE + cleanTags(after, strongS, strongE);
}
private String cleanTags(String source, String... exp){
for(String s: exp){
source = source.replace(s, "");
}
return source;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return true; }
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; }
@Override
public void onDestroyActionMode(ActionMode mode) {}
}
}