0

我正在开发一个计算器应用程序,我想以不同的颜色显示 + - / * 等符号。我使用 TextView 作为我的显示器。

当使用这样的代码按下按钮时,我能够做到这一点

coloredOperator = "<font color=#BED505>"+buttonPressed+"</font>";

textView.append(Html.fromHtml(coloredOperator));

然而,随后我实现了一个关于文本更改的代码,以便在我的 textView 上创建新行时对操作进行排序,如下所示:

public void onTextChanged(CharSequence s, int start, int before, int count){
    String message = s.toString();

// I have a java class that takes cares of this             
    int lastPositionOfBreakCharacter = getLastIndexOfRegex(message, "\\-|\\+|\\/|\\*|\\^");


    int length = s.length();
    int breakPosition = length-lastPositionOfBreakCharacter;

    String text_view_text=t.getText().toString();
    StringBuffer sb=new StringBuffer(text_view_text);
    // So a new line is inserted before the last character +|-|* etc...
    sb.insert(breakPosition,"\n");
    textView.setText(sb);
}

问题是,显然最后一个函数剥夺了我所有 Spannables 的文本视图,从而失去了风格。

有没有办法解析文本以查找特殊字符,添加相应的 Spannables 然后使用 .setText()?

或者你对如何实现我所追求的有任何其他想法?

谢谢!!!

4

1 回答 1

1

如何在 android 中使用 SpannableString 和正则表达式?

正确答案适用于这个问题。

////////////

 public class SpanTest extends Activity {

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         String dispStr = "This has the string ABCDEF in it \nSo does this :ABCDEF - see!\nAnd again ABCD here";
         TextView tv = (TextView) findViewById(R.id.textView1);
        tv.setText(dispStr);
        changeTextinView(tv, "ABC", Color.RED);
    }

     private void changeTextinView(TextView tv, String target, int colour) {
         String vString = (String) tv.getText();
         int startSpan = 0, endSpan = 0;
         Spannable spanRange = new SpannableString(vString);

         while (true) {
             startSpan = vString.indexOf(target, endSpan);
             ForegroundColorSpan foreColour = new ForegroundColorSpan(colour);
             // Need a NEW span object every loop, else it just moves the span
             if (startSpan < 0)
                 break;
             endSpan = startSpan + target.length();
             spanRange.setSpan(foreColour, startSpan, endSpan,
                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        tv.setText(spanRange);
    }
}
于 2013-11-21T21:41:23.440 回答