Изменить цвет текста, когда пользователь вводит хэш-теги

Я работаю над приложением, в котором пользователь может публиковать контент в фиде. В моем редактируемом тексте (используемом для создания) цвет текста серый. Однако, когда пользователь вводит хеш-тег, например #help, мне нужно покрасить этот текст в черный цвет по мере его ввода, поэтому, когда пользователь вводит '#', текст должен окрашиваться в черный цвет, пока они не начнут новое слово, тогда цвет текста должен измениться. серым

Я пытался использовать наблюдателя текста и Spanable строки для цвета.

Вот что я сделал с 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);
                }
            }

метод 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 является Spannable.

Проблема этого метода в том, что "#" отображается как startChar, однако, когда пользователь вводит следующий символ, символ или букву, он затем отображается как startChar. Где, как будто пользователь набрал santa - 's', остается startChar. Так что проблема, с которой я сталкиваюсь, заключается в том, как динамически окрашивать текст, когда пользователь вводит хэштег.

Таким образом, простые буквы работают правильно, однако при использовании символа это не так. Я надеюсь, что вопрос имеет ясность.. Я смотрю на это в течение нескольких дней, и все становится туманным:)

2 ответа

Решение

Я попытался и нашел решение

Вы можете использовать следующий код

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

Мне удалось добиться того поведения, которое вы описываете, просто я устанавливаю цветной текст в отдельном TextView. Смотрите скриншот и код ниже. надеюсь, это поможет

В afterTextChanged из слушателя:

@Override
public void afterTextChanged(Editable s) {
     editText.removeTextChangedListener(textWatcher);
     colorText(s.toString());
}

Метод поиска символов "#" и цветного текста до первого пробела:

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 просто добавляет цвет от начала индекса до конца индекса

private void colorSpannable(Spannable s, int start, int end){
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

введите описание изображения здесь

Другие вопросы по тегам