我已将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) {}
    }
}

10-07 19:13
查看更多