0

我有一个editText,我想在其中加粗我选择的文本。我正在使用带有按钮的上下文操作栏来加粗选定的单词。问题是,如果我加粗一个词,我就不能加粗另一个词,如果我从那个词中删除跨度,我就不能再次添加它。et 是我在其中编写的editText,我还使用 2 SpannableString 来捕获剩余的文本,以保持之前添加的最终跨度。

自定义回调

cs1 = new StyleSpan(Typeface.BOLD);

class CustomCallback implements ActionMode.Callback {
public boolean onCreateActionMode(ActionMode mode, Menu menu) {

    //exploiting the CAB

    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
    menu.removeItem(android.R.id.selectAll);
    return true;
}

public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
}

行动加粗

public boolean onActionItemClicked(ActionMode mode, MenuItem item) {


    int start = et.getSelectionStart();
    int end = et.getSelectionEnd();




    SpannableStringBuilder s_before,s_next;

    SpannableStringBuilder ssb = new SpannableStringBuilder(et.getText().subSequence(start, end));
    s_before= new SpannableStringBuilder (et.getText().subSequence(0, start));
    s_next= new SpannableStringBuilder (et.getText().subSequence(end, et.length()));



    switch(item.getItemId()) {


    case R.id.bold:

        int a=ssb.getSpanStart(cs1);
        int b=ssb.getSpanEnd(cs1);


        if(a==-1 && b==-1){

            ssb.setSpan(cs1, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        else{
            ssb.removeSpan(cs1);
        }
        et.setText("");
        et.append(s_before);
        et.append(ssb);
        et.append(s_next);

        return true;

我该如何解决?提前致谢。

4

1 回答 1

3

我刚刚放了一个 RichEditText 库https://github.com/kemallette/RichEditText ,它添加了粗体/斜体/strike/underline .. 和其他一些字体样式功能。它还增加了一堆很棒的验证。

如果这不符合您的需求,您将需要专注于跟踪跨度的位置、它们的类型以及它们正在被调整/重新添加。看看上面库中的 RichEditText 和 RichTextWatcher 类。它会让您更好地了解 EditText 中的文本更改时实际发生的情况。

于 2013-04-22T09:15:04.653 回答