android - seleccionar - editar texto carrito woocommerce
Cambie el color del texto a medida que el usuario escribe las etiquetas hash (2)
Estoy trabajando en una aplicación donde el usuario puede publicar contenido en un feed. En mi texto de edición (usado para componer), el color del texto es gris. Sin embargo, cuando el usuario escribe una etiqueta hash, por ejemplo #help, necesito colorear el texto en negro a medida que escribo, así que cuando el usuario escriba ''#'' el texto debe ser de color negro hasta que empiece una nueva palabra, entonces el color del texto debe revertirse a gris
He intentado usar un observador de texto y una cadena de caracteres para colorear.
Esto es lo que hice con el textwatcher onTextChanged
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Remove Text watcher to prevent infinite look
mTextField.removeTextChangedListener(contentFieldWatcher);
String startChar = null;
startChar = Character.toString(s.charAt(start));
L.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar);
if (startChar.equals("#")) {
tagCheck(s.toString().substring(start), start, start + count);
}
}
método tagCheck
private void tagCheck(String s, int start, int end) {
mSpannable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.black_colour)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
mSpannable es un Spannable.
El problema con este método es que ''#'' se muestra como startChar, sin embargo, cuando el usuario escribe el siguiente carácter, ya sea un símbolo o una letra, se muestra como startChar. Donde como si el usuario escribiera santa - ''s'' sigue siendo el startChar. Entonces, el problema que tengo es cómo colorear dinámicamente el texto a medida que el usuario escribe un hashtag.
Así que las letras simples funcionan correctamente, sin embargo, cuando usa un símbolo, no funciona. Espero que la pregunta tenga claridad. He estado mirando esto por unos días y todo se vuelve brumoso :)
Intenté y encontré la solución
Puedes usar el siguiente código
Spannable mspanable;
int hashTagIsComing = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText edt = (EditText) findViewById(R.id.editText1);
mspanable = edt.getText();
edt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String startChar = null;
try{
startChar = Character.toString(s.charAt(start));
Log.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar);
}
catch(Exception ex){
startChar = " ";
}
if (startChar.equals("#")) {
tagCheck(s.toString().substring(start), start, start + count);
hashTagIsComing++;
}
if(startChar.equals(" ")){
hashTagIsComing = 0;
}
if(hashTagIsComing != 0) {
tagCheck(s.toString().substring(start), start, start + count);
hashTagIsComing++;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
private void tagCheck(String s, int start, int end) {
mspanable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
Me las arreglé para lograr el comportamiento que está describiendo, es solo que estoy configurando el texto de color en un TextView por separado. Vea la captura de pantalla y el código a continuación. espero que esto ayude
En AfterTextChanged del oyente:
@Override
public void afterTextChanged(Editable s) {
editText.removeTextChangedListener(textWatcher);
colorText(s.toString());
}
Método para buscar caracteres "#" y texto de color hasta el primer espacio:
private void colorText(String s) {
if (!TextUtils.isEmpty(s)) {
Spannable spannable = new SpannableString(s);
int position = 0;
position = s.indexOf("#", position);
while (position != -1) {
colorSpannable(spannable, position, s.indexOf(" ", position + 1) != -1 ? s.indexOf(" ", position + 1) : s.length());
position = s.indexOf("#", position + 1);
}
textView.setText(spannable);
}
editText.addTextChangedListener(textWatcher);
}
colorSpannable simplemente agrega el color desde el inicio del índice al final del índice
private void colorSpannable(Spannable s, int start, int end){
s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}