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