Есть ли пример с текстом Spanned и Spannable?

Я борюсь с использованием текстового объекта EditText и Spannable. В эти дни я читал документы API примерно десять раз, даже я не уверен, что правильно понимаю. Поэтому я ищу пример, который показывает мне, как использовать EditText и Spannable.

Ответ 1

Поскольку вы не укажете, что вы не можете понять из API, сложно ответить на ваши вопросы (короткий ответ: перепишите свой вопрос на конкретные вопросы, а не на общий).

Типичный пример Spannable - это что-то вроде этого, чтобы превратить выделенный текст в EditText в Italic:

Spannable str = mBodyText.getText(); 
if(mBodyText.getSelectionEnd() > mBodyText.getSelectionStart()) 
  str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC),  
                      mBodyText.getSelectionStart(), mBodyText.getSelectionEnd(),  
                      Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
else
  str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC),
              mBodyText.getSelectionEnd(),
              mBodyText.getSelectionStart(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Это вырезано и вставлено из чего-то другого, так что может пострадать ваша непосредственная пассивность, но он, по крайней мере, показывает рабочий пример Spannable (в данном случае a StyleSpan). В API вы можете найти другие типы Spans (особенно ImageSpan, что является распространенным вопросом среди вновь преобразованных дроидов).

Ответ 2

Я только начинаю пытаться понять это тоже, и это кажется излишне сложным.

Здесь приведен рабочий метод для добавления NEW spannable text в существующее представление. Я хотел добавить цветный текст в представление, и это казалось единственным способом сделать это.

Хотя это кажется уродливым взломом, вы можете создать фиктивный TextView (не показан нигде) и нарисовать текст там, а затем добавить этот стилизованный текст туда, где хотите. Кредит для него идет на iifuzz на anddev.org. Мой код выглядит так:

    spanbuffer = new TextView(context);
    spanbuffer.setText(newText, TextView.BufferType.SPANNABLE);
    Spannable s = (Spannable) spanbuffer.getText();
    s.setSpan(new ForegroundColorSpan(Color.RED), 0, newText.length() - 1, 0);
    this.append(s);

Я думаю, вы должны создать новый spannable текст, используя SpannableFactory, например:

    Spannable s = Spannable.Factory.getInstance().newSpannable(newText);

но я не мог заставить этот текст показывать новые эффекты диапазона, поэтому я сдался.