Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 删除跨距上的样式_Android_Spannablestring_Spannable_Spanned - Fatal编程技术网

Android 删除跨距上的样式

Android 删除跨距上的样式,android,spannablestring,spannable,spanned,Android,Spannablestring,Spannable,Spanned,我使用了StyleSpanRemover从所选文本中删除样式,但我遇到了一个问题。 我想要一个bold按钮,用于切换所选文本的粗体样式。这意味着,如果所选文本(或其中的一部分)不加粗,则加粗所有文本;如果所有选定文本均为粗体,则从中删除粗体样式。 但是当我使用这段代码时,在删除文本的粗体样式并再次粗体后,getStyle()总是返回Typeface.NORMAL 以下是我使用的代码: boolean isAllSpansBold = true; /** * B

我使用了
StyleSpanRemover
从所选文本中删除样式,但我遇到了一个问题。 我想要一个
bold
按钮,用于切换所选文本的粗体样式。这意味着,如果所选文本(或其中的一部分)不加粗,则加粗所有文本;如果所有选定文本均为粗体,则从中删除粗体样式。 但是当我使用这段代码时,在删除文本的粗体样式并再次粗体后,
getStyle()
总是返回
Typeface.NORMAL

以下是我使用的代码:

boolean isAllSpansBold = true;

        /**
         * Bold selected text
         */
        Spannable spannable = new SpannableString(mEditTextContent.getText());

        StyleSpan[] styleSpans = mEditTextContent.getText().getSpans(
                mEditTextContent.getSelectionStart(),
                mEditTextContent.getSelectionEnd(),
                StyleSpan.class
        );


        if(styleSpans.length == 0)
        {
            spannable.setSpan(
                    new StyleSpan(Typeface.BOLD),
                    mEditTextContent.getSelectionStart(),
                    mEditTextContent.getSelectionEnd(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );

            Log.d("Ramansoft", "styleSpans.length = 0");
        }
        else
        {
            for(int i=0; i<styleSpans.length; i++) {
                Log.d("Ramansoft", "The style is: " + String.valueOf(styleSpans[i].getStyle()));

                if (styleSpans[i].getStyle() != Typeface.BOLD && styleSpans[i].getStyle() != Typeface.BOLD_ITALIC) {
                    isAllSpansBold = false;
                    break;
                }
            }

            if(isAllSpansBold)
            {
                StyleSpanRemover styleSpanRemover = new StyleSpanRemover();
                styleSpanRemover.RemoveStyle(
                        spannable,
                        mEditTextContent.getSelectionStart(),
                        mEditTextContent.getSelectionEnd(),
                        Typeface.BOLD
                );

                Log.d("Ramansoft", "isAllSpansBold = true");
            }
            else
            {
                spannable.setSpan(
                        new StyleSpan(Typeface.BOLD),
                        mEditTextContent.getSelectionStart(),
                        mEditTextContent.getSelectionEnd(),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );

                Log.d("Ramansoft", "isAllSpansBold = false");
            }
布尔值isAllSpansBold=true;
/**
*粗体选定文本
*/
Spannable Spannable=newspannablestring(mEditTextContent.getText());
StyleSpan[]StyleSpan=mEditTextContent.getText().getspan(
mEditTextContent.getSelectionStart(),
mEditTextContent.getSelectionEnd(),
StyleSpan.class
);
if(stylespan.length==0)
{
安装盘(
新样式span(字体粗体),
mEditTextContent.getSelectionStart(),
mEditTextContent.getSelectionEnd(),
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
);
Log.d(“Ramansoft”、“styleSpans.length=0”);
}
其他的
{

对于(inti=0;i,经过多次尝试,我可以做到。这是解决方案

public class SpanStyleHelper
{
protected EditText mEditText;
protected Spannable mSpannable;
protected int mSelectedTextStart;
protected int mSelectedTextEnd;

public SpanStyleHelper(EditText editText)
{
    mEditText = editText;
    mSpannable = mEditText.getText();
    mSelectedTextStart = mEditText.getSelectionStart();
    mSelectedTextEnd = mEditText.getSelectionEnd();
}

public Spannable boldSelectedText()
{
    Log.d("Ramansoft", "Try to bold selected text..");

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
            mSelectedTextStart,
            mSelectedTextEnd,
            StyleSpan.class
    );

    if(styleSpans.length > 0) {

        int lastSpanEnd = 0;

        for (StyleSpan styleSpan : styleSpans) {
            /**
             * Save old style
             */
            int oldStyle = styleSpan.getStyle();


            /**
             * Get start and end of span
             */
            int spanStart = mSpannable.getSpanStart(styleSpan);
            int spanEnd = mSpannable.getSpanEnd(styleSpan);


            /**
             * Before bold this span, we check if any unspanned
             * text between this span and last span remains. if any
             * unspanned text exist, we should bold it
             */
            if(spanStart > lastSpanEnd)
            {
                mSpannable.setSpan(
                        new StyleSpan(Typeface.BOLD),
                        lastSpanEnd,
                        spanStart,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }

            /**
             * Update last span end
             */
            lastSpanEnd = spanEnd;


            /**
             * Remove the span
             */
            mSpannable.removeSpan(styleSpan);


            /**
             * Because we just need change selected text,
             * if span start is lower than selected text start or
             * if span end is higher than selected text end start
             * we should restore span for unselected part of span
             */
            if (spanStart < mEditText.getSelectionStart()) {
                mSpannable.setSpan(
                        new StyleSpan(oldStyle),
                        spanStart,
                        mSelectedTextStart,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }

            if (spanEnd > mEditText.getSelectionEnd()) {
                mSpannable.setSpan(
                        new StyleSpan(oldStyle),
                        mSelectedTextEnd,
                        spanEnd,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }

            /**
             * We want to add bold style to current style
             * so we most detect current style and change
             * the style depend on current style
             */
            if (oldStyle == Typeface.ITALIC) {
                mSpannable.setSpan(
                        new StyleSpan(Typeface.BOLD_ITALIC),
                        spanStart,
                        spanEnd,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            } else {
                mSpannable.setSpan(
                        new StyleSpan(Typeface.BOLD),
                        spanStart,
                        spanEnd,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }
        }

        /**
         * Now we should check if any
         * unspanned selected text remains
         */
        if(mSelectedTextEnd != lastSpanEnd)
        {
            mSpannable.setSpan(
                    new StyleSpan(Typeface.BOLD),
                    lastSpanEnd,
                    mSelectedTextEnd,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }
    }
    else
    {
        mSpannable.setSpan(
                new StyleSpan(Typeface.BOLD),
                mSelectedTextStart,
                mSelectedTextEnd,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        );
    }

    return mSpannable;
}

public Spannable unBoldSelectedText()
{
    Log.d("Ramansoft", "Try to unbold selected text..");

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
            mSelectedTextStart,
            mSelectedTextEnd,
            StyleSpan.class
    );

    for(StyleSpan styleSpan:styleSpans)
    {
        /**
         * Save old style
         */
        int oldStyle = styleSpan.getStyle();


        /**
         * Get start and end of span
         */
        int spanStart = mSpannable.getSpanStart(styleSpan);
        int spanEnd = mSpannable.getSpanEnd(styleSpan);


        /**
         * Remove the span
         */
        mSpannable.removeSpan(styleSpan);


        /**
         * Because we just need change selected text,
         * if span start is lower than selected text start or
         * if span end is higher than selected text end start
         * we should restore span for unselected part of span
         */
        if(spanStart < mEditText.getSelectionStart())
        {
            mSpannable.setSpan(
                    new StyleSpan(oldStyle),
                    spanStart,
                    mSelectedTextStart,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }

        if(spanEnd > mEditText.getSelectionEnd())
        {
            mSpannable.setSpan(
                    new StyleSpan(oldStyle),
                    mSelectedTextEnd,
                    spanEnd,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }

        /**
         * Because we just want to remove bold style,
         * if the span has another style, we should restore it
         */
        if(oldStyle == Typeface.BOLD_ITALIC)
        {
            mSpannable.setSpan(
                    new StyleSpan(Typeface.ITALIC),
                    spanStart,
                    spanEnd,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }
    }

    return mSpannable;
}

public Spannable toggleBoldSelectedText()
{
    Log.d("Ramansoft", "Try to toggle bold selected text..");

    boolean isAllSpansBold = true;


    StyleSpan[] styleSpans = mEditText.getText().getSpans(
            mSelectedTextStart,
            mSelectedTextEnd,
            StyleSpan.class
    );


    if(styleSpans.length == 0)
    {
        return boldSelectedText();
    }
    else
    {
        for(StyleSpan styleSpan:styleSpans)
        {
            Log.d("Ramansoft", "styleSpan.getStyle() = " + styleSpan.getStyle());

            if (styleSpan.getStyle() != Typeface.BOLD && styleSpan.getStyle() != Typeface.BOLD_ITALIC) {
                isAllSpansBold = false;
                break;
            }
        }

        Log.d("Ramansoft", "isAllSpansBold = " + isAllSpansBold);


        if(isAllSpansBold)
            return unBoldSelectedText();
        else
            return boldSelectedText();
    }

}

public Spannable italicSelectedText()
{
    Log.d("Ramansoft", "Try to italic selected text..");

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
            mSelectedTextStart,
            mSelectedTextEnd,
            StyleSpan.class
    );

    if(styleSpans.length > 0)
    {
        int lastSpanEnd = 0;

        for (StyleSpan styleSpan : styleSpans) {
            /**
             * Save old style
             */
            int oldStyle = styleSpan.getStyle();


            /**
             * Get start and end of span
             */
            int spanStart = mSpannable.getSpanStart(styleSpan);
            int spanEnd = mSpannable.getSpanEnd(styleSpan);


            /**
             * Before italic this span, we check if any unspanned
             * text between this span and last span remains. if any
             * unspanned text exist, we should italic it
             */
            if(spanStart > lastSpanEnd)
            {
                mSpannable.setSpan(
                        new StyleSpan(Typeface.ITALIC),
                        lastSpanEnd,
                        spanStart,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }


            /**
             * Update last span end
             */
            lastSpanEnd = spanEnd;


            /**
             * Remove the span
             */
            mSpannable.removeSpan(styleSpan);


            /**
             * Because we just need change selected text,
             * if span start is lower than selected text start or
             * if span end is higher than selected text end start
             * we should restore span for unselected part of span
             */
            if (spanStart < mEditText.getSelectionStart()) {
                mSpannable.setSpan(
                        new StyleSpan(oldStyle),
                        spanStart,
                        mSelectedTextStart,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }

            if (spanEnd > mEditText.getSelectionEnd()) {
                mSpannable.setSpan(
                        new StyleSpan(oldStyle),
                        mSelectedTextEnd,
                        spanEnd,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }

            /**
             * We want to add bold style to current style
             * so we most detect current style and change
             * the style depend on current style
             */
            if (oldStyle == Typeface.BOLD) {
                mSpannable.setSpan(
                        new StyleSpan(Typeface.BOLD_ITALIC),
                        spanStart,
                        spanEnd,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            } else {
                mSpannable.setSpan(
                        new StyleSpan(Typeface.ITALIC),
                        spanStart,
                        spanEnd,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                );
            }
        }

        /**
         * Now we should check if any
         * unspanned selected text remains
         */
        if(mSelectedTextEnd != lastSpanEnd)
        {
            mSpannable.setSpan(
                    new StyleSpan(Typeface.ITALIC),
                    lastSpanEnd,
                    mSelectedTextEnd,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }
    }
    else
    {
        mSpannable.setSpan(
                new StyleSpan(Typeface.ITALIC),
                mSelectedTextStart,
                mSelectedTextEnd,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        );
    }

    return mSpannable;
}

public Spannable unItalicSelectedText()
{
    Log.d("Ramansoft", "Try to un-italic selected text..");

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
            mSelectedTextStart,
            mSelectedTextEnd,
            StyleSpan.class
    );

    for(StyleSpan styleSpan:styleSpans)
    {
        /**
         * Save old style
         */
        int oldStyle = styleSpan.getStyle();


        /**
         * Get start and end of span
         */
        int spanStart = mSpannable.getSpanStart(styleSpan);
        int spanEnd = mSpannable.getSpanEnd(styleSpan);


        /**
         * Remove the span
         */
        mSpannable.removeSpan(styleSpan);


        /**
         * Because we just need change selected text,
         * if span start is lower than selected text start or
         * if span end is higher than selected text end start
         * we should restore span for unselected part of span
         */
        if(spanStart < mEditText.getSelectionStart())
        {
            mSpannable.setSpan(
                    new StyleSpan(oldStyle),
                    spanStart,
                    mSelectedTextStart,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }

        if(spanEnd > mEditText.getSelectionEnd())
        {
            mSpannable.setSpan(
                    new StyleSpan(oldStyle),
                    mSelectedTextEnd,
                    spanEnd,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }

        /**
         * Because we just want to remove bold style,
         * if the span has another style, we should restore it
         */
        if(oldStyle == Typeface.BOLD_ITALIC)
        {
            mSpannable.setSpan(
                    new StyleSpan(Typeface.BOLD),
                    spanStart,
                    spanEnd,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }
    }

    return mSpannable;
}

public Spannable toggleItalicSelectedText()
{
    Log.d("Ramansoft", "Try to toggle italic selected text..");

    boolean isAllSpansItalic = true;


    StyleSpan[] styleSpans = mEditText.getText().getSpans(
            mSelectedTextStart,
            mSelectedTextEnd,
            StyleSpan.class
    );


    if(styleSpans.length == 0)
    {
        return italicSelectedText();
    }
    else
    {
        for(StyleSpan styleSpan:styleSpans)
        {
            Log.d("Ramansoft", "styleSpan.getStyle() = " + styleSpan.getStyle());

            if (styleSpan.getStyle() != Typeface.ITALIC && styleSpan.getStyle() != Typeface.BOLD_ITALIC) {
                isAllSpansItalic = false;
                break;
            }
        }

        Log.d("Ramansoft", "isAllSpansItalic = " + isAllSpansItalic);


        if(isAllSpansItalic)
            return unItalicSelectedText();
        else
            return italicSelectedText();
    }
}
}
公共类SpanStyleHelper
{
受保护的EditText-mEditText;
受保护的可扩展mSpannable;
受保护的整数mSelectedTextStart;
受保护的int MSelectedExtend;
公共SpanStyleHelper(EditText EditText)
{
mEditText=编辑文本;
mSpannable=mEditText.getText();
mSelectedTextStart=mEditText.getSelectionStart();
mselectedtdextend=mEditText.getSelectionEnd();
}
公共Spannable boldSelectedText()
{
Log.d(“Ramansoft”,“尝试加粗选定文本…”);
StyleSpan[]StyleSpan=mEditText.getText().getspan(
mSelectedTextStart,
MSelectedExtend,
StyleSpan.class
);
如果(styleSpans.length>0){
int lastSpanEnd=0;
for(StyleSpan StyleSpan:StyleSpan){
/**
*保存旧式
*/
int oldStyle=styleSpan.getStyle();
/**
*获得跨度的起点和终点
*/
int spanStart=mSpannable.getSpanStart(styleSpan);
int spanEnd=mSpannable.getSpanEnd(styleSpan);
/**
*在加粗此跨度之前,我们检查是否存在未经退火的
*此范围和最后一个范围之间的文本保留。如果有
*如果存在未经处理的文本,我们应该将其加粗
*/
如果(开始>最后结束)
{
mSpannable.setSpan(
新样式span(字体粗体),
最后,
开始,
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
);
}
/**
*更新最后一个跨度末端
*/
lastSpanEnd=spanEnd;
/**
*移除跨度
*/
mSpannable.removeSpan(styleSpan);
/**
*因为我们只需要更改选定的文本,
*如果跨度起点低于选定的文字起点或
*如果范围结束高于所选文本结束开始
*我们应该为span中未选择的部分恢复span
*/
如果(spanStartmEditText.getSelectionEnd()){
mSpannable.setSpan(
新样式跨度(旧样式),
MSelectedExtend,
斯潘恩德,
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
);
}
/**
*我们希望在当前样式中添加粗体样式
*因此,我们最能察觉当前的风格和变化
*样式取决于当前样式
*/
if(oldStyle==Typeface.ITALIC){
mSpannable.setSpan(
新样式span(字体:粗体+斜体),
开始,
斯潘恩德,
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
);
}否则{
mSpannable.setSpan(
新样式span(字体粗体),
开始,
斯潘恩德,
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
);
}
}
/**
*现在我们应该检查一下是否有
*未扫描的选定文本仍保留
*/
如果(mSelectedTextEnd!=lastSpanEnd)
{
mSpannable.setSpan(
新样式span(字体粗体),
最后,
MSelectedExtend,
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
);
}
}
其他的
{
mSpannable.setSpan(
新样式span(字体粗体),
mSelectedTextStart,
MSelectedExtend,
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
);
}
返回mSpannable;
}
公共span可取消绑定SelectedText()
{
Log.d(“Ramansoft”,“尝试取消所选文本的绑定…”);
StyleSpan[]StyleSpan=mEditText.getText().getspan(
mSelectedTextStart,
MSelectedExtend,
StyleSpan.class
);
for(StyleSpan StyleSpan:StyleSpan)
{
/**
*保存旧式
*/
int oldStyle=styleSpan.getStyle();
/**
*开始和结束s