Как добавить несколько шрифтов в один EditText означает, что каждое слово имеет разные шрифты в зависимости от времени выполнения - PullRequest
2 голосов
/ 22 июня 2019

Привет, мне нужно добавить несколько шрифтов к каждому слову, введенному в тексте редактирования, значит, каждое слово имеет другой шрифт, я выполнил часть работы с приведенным ниже кодом.

SpannableStringBuilder SS = new 
SpannableStringBuilder(enterword.getText().toString());
SS.setSpan (new CustomTypefaceSpan("", font2), 0, size , 
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
enterword.setText(SS);

, но этот работает, когда вы вручную назначаете текст. также я прикрепляю изображение введите описание изображения здесь

1 Ответ

0 голосов
/ 22 июня 2019

Это немного сложно сделать в EditText, так как это редактируемый.Один из подходов, который вы можете предпринять, - добавить TextWatcher или onTextChangedListener к вашему EditText.

Переопределить afterTextChanged из TextWatcher и добавить пользовательскую логику, например, следующую.

String[] words = text.split();
SpannableStringBuilder sb = new SpannableStringBuilder();
for (String word in words) {
    SpannableString spanned = new SpannableString(word);
    spanned.setSpan( -- your font span here --);
    sb.append(spanned);
    sb.append(" ");
}

editText.setText(sb);

Вы должны добавить свою собственную логику, когда и как вы хотите преобразовать ее.Когда вы звоните editText.setText, срабатывает afterTextChanged.Вам нужно позаботиться об этой рекурсии, используя некоторый флаг и handler для обратных вызовов.

Вы можете иметь что-то вроде этого.

class FontWatcher(private val editText: EditText) : TextWatcher {
    private val handler = Handler()
    private var locked = false

    private val updateCallback = Runnable {
        locked = true
        // Create your spannable as mentioned above
        editText.setText(sb, TextView.BufferType.EDITABLE)
        editText.setSelection(sb.length)
        locked = false
    }

    override fun afterTextChanged(s: Editable) {
        if (!locked) {
            handler.removeCallbacks(updateCallback)
            handler.postDelayed(updateCallback, 300)
        }
    }
}

Это не оптимизировано, но должно помочь вам получитьначал.

...