Я придумываю простое решение, используя тег типа HTML
ImageBtn.setOnClickListener(new OnClickListener() {
@override
public void onClick(View view) {
// TODO Auto-generated method stub
mContentEdit.append("[1;34m [m"); //this is the tag I use
//here I simplely append new tag to the end ,we can also add this tag where cursor is
}
});
добавить TextWatcher для моего EditText;
mContentEdit.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
switch(mInsertIndex){
case 1:
mSelection = mContentEdit.getSelectionStart();
break;
case 2:
mContentEdit.setSelection(mSelection);
break; //recover the cursor's position
}
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
switch (mInsertIndex) {
case 1:
//this is p:Pattern p = Pattern.compile("\\[[\\d{1};]*(3\\d{1})m(.*?)\\[[\\d;]*m");
Matcher m = p.matcher(s.toString());
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb, "<font color=#"+CssUtil.getColor(m.group(1))+">"+"[1;"+m.group(1)+"m"+m.group(2)+"[m"+"</font>");
} //add a tag otherwise the next time we input,color will be gone;
m.appendTail(sb);
mInsertIndex = 2;
mContentEdit.setText(Html.fromHtml(sb.toString()));
break;
//replace tag by html color
case 2:
mInsertIndex = 1;
break;
//avoid recursive message loop
}
}
этот код хорошо работает для моего приложения. Я могу опубликовать необработанный текст в виде текста непосредственно на веб-сайте, и веб-сайт будет анализировать теги для цвета CSS;
Но есть еще дефект:
1: Что делать, если я не хочу видеть теги?
В моем вопросе мне нужен фактически конечный автомат цвета, после нажатия которого, когда бы вы ни вводили, цвет будет иметь эффект. Но в моем решении я должен ввести теги.
2: С ростом длины ввода может возникнуть проблема с эффективностью;
Как видите, используется регулярное выражение;
Итак, все еще с нетерпением жду героя, чтобы решить мою проблему!