gpt4 book ai didi

android - 从编辑文本中的选定文本中删除样式

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:09 25 4
gpt4 key购买 nike

我的应用应该允许用户在 Edittext 中设置输入或选择文本的样式。其中一些样式是下划线、删除线、粗体和斜体。它们很容易添加,但我不知道如何删除它们以及我如何确定该样式是否已添加到所选文本。添加样式代码:

Spannable str = myEditText.getText();
if (!SpannableUtils.isEmpty(str)) {
str.setSpan(new StrikethroughSpan(), startSelection, endSelection,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

我尝试使用 removeSpan,但没有用。也尝试使用

        str.setSpan(new StyleSpan(android.graphics.Typeface.DEFAULT),
startSelection, endSelection,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

但它会引发错误:构造函数 StyleSpan(Typeface) 未定义。

最佳答案

我认为这门课可以解决您的问题。

public class StyleSpanRemover {

public void RemoveOne(Spannable spannable,
int startSelection, int endSelection, Class<?> style){

ArrayList<SpanParts> spansParts = getSpanParts(spannable, startSelection, endSelection);
removeOneSpan(spannable, startSelection, endSelection, style);
restoreSpans(spannable, spansParts);
}

public void RemoveStyle(Spannable spannable,
int startSelection, int endSelection, int styleToRemove){

ArrayList<SpanParts> spansParts = getSpanParts(spannable, startSelection, endSelection);
removeStyleSpan(spannable, startSelection, endSelection, styleToRemove);
restoreSpans(spannable, spansParts);
}

public void RemoveAll(Spannable spannable, int startSelection, int endSelection){

ArrayList<SpanParts> spansParts = getSpanParts(spannable, startSelection, endSelection);
removeAllSpans(spannable, startSelection, endSelection);
restoreSpans(spannable, spansParts);
}

protected void restoreSpans(Spannable spannable, ArrayList<SpanParts> spansParts){

for (SpanParts spanParts : spansParts) {
if(spanParts.part1.canAplly())
spannable.setSpan(spanParts.part1.span, spanParts.part1.start,
spanParts.part1.end,spanParts.span_flag);
if(spanParts.part2.canAplly())
spannable.setSpan(spanParts.part2.span, spanParts.part2.start,
spanParts.part2.end, spanParts.span_flag);
}
}

protected void removeAllSpans(Spannable spannable,int startSelection, int endSelection) {

Object spansToRemove[] = spannable.getSpans(startSelection, endSelection, Object.class);
for(Object span: spansToRemove){
if(span instanceof CharacterStyle)
spannable.removeSpan(span);
}
}

protected void removeOneSpan(Spannable spannable,int startSelection, int endSelection,
Class<?> style) {

CharacterStyle spansToRemove[] = spannable.getSpans(startSelection, endSelection, CharacterStyle.class);
for(CharacterStyle span: spansToRemove){
if(span.getUnderlying().getClass() == style )
spannable.removeSpan(span);
}
}

protected void removeStyleSpan(Spannable spannable, int startSelection,
int endSelection, int styleToRemove) {

MetricAffectingSpan spans[] = spannable.getSpans(startSelection, endSelection, MetricAffectingSpan.class);
for(MetricAffectingSpan span: spans){
int stylesApplied = 0;
int stylesToApply;
int spanStart;
int spanEnd;
int spanFlag;
Object spanUnd = span.getUnderlying();
if(spanUnd instanceof StyleSpan){
spanFlag = spannable.getSpanFlags(spanUnd);
stylesApplied = ((StyleSpan) spanUnd).getStyle();
stylesToApply = stylesApplied & ~styleToRemove;

spanStart = spannable.getSpanStart(span);
spanEnd = spannable.getSpanEnd(span);
if(spanEnd >= 0 && spanStart >= 0){
spannable.removeSpan(span);
spannable.setSpan(new StyleSpan(stylesToApply), spanStart, spanEnd,spanFlag);
}
}
}
}

protected ArrayList<SpanParts> getSpanParts(Spannable spannable,
int startSelection,int endSelection){

ArrayList<SpanParts> spansParts = new ArrayList<SpanParts>();
Object spans[] = spannable.getSpans(startSelection, endSelection, Object.class);
for(Object span: spans){
if(span instanceof CharacterStyle){
SpanParts spanParts = new SpanParts();
int spanStart = spannable.getSpanStart(span);
int spanEnd = spannable.getSpanEnd(span);
if(spanStart == startSelection && spanEnd == endSelection) continue;
spanParts.span_flag = spannable.getSpanFlags(span);
spanParts.part1.span = CharacterStyle.wrap((CharacterStyle) span);
spanParts.part1.start = spanStart;
spanParts.part1.end = startSelection;
spanParts.part2.span = CharacterStyle.wrap((CharacterStyle) span);
spanParts.part2.start = endSelection;
spanParts.part2.end = spanEnd;
spansParts.add(spanParts);
}
}
return spansParts;
}

private class SpanParts{
int span_flag;
Part part1;
Part part2;
SpanParts() {
part1 = new Part();
part2 = new Part();
}
}
private class Part{
CharacterStyle span;
int start;
int end;
boolean canAplly() {
return start < end;
}
}
}

使用方法:

int startSelection=editText.getSelectionStart();
int endSelection=editText.getSelectionEnd();
Spannable spannable = editText.getText();

StyleSpanRemover spanRemover = new StyleSpanRemover();
// to remove all styles
spanRemover.RemoveAll(spannable,startSelection,endSelection);
//to remove only StrikethroughSpan style use:
spanRemover.RemoveOne(spannable,startSelection,endSelection,StrikethroughSpan.class);
//to remove one StyleSpan use:
spanRemover.RemoveStyle(spannable,startSelection,endSelection,Typeface.BOLD)

关于android - 从编辑文本中的选定文本中删除样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com