textos texto seleccionar producto personalizar pagina opciones oferta modificar los editar con como color carrito cambiar android android-edittext textwatcher spannable

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); }