Изменение стилей в TextView: можете ли вы вызвать getText, а затем setSpan?

#android #textview

#Android #textview

Вопрос:

Можете ли вы вызвать getText () в TextView, а затем вызвать setSpan () для результирующего объекта? Я знаю, что это работает (по крайней мере, на телефонах, которые я пробовал в 2.2 и 2.3), но в документе для getText () четко сказано, что вы не можете изменить результат getText ().

setSpan, конечно, выглядел как модификация, но после внимательного прочтения документации я не так уверен:

 setSpan(Object what, int start, int end, int flags)
Attach the specified markup object to the range startend of the text, or move the object     to that range if it was already attached elsewhere.
  

Я могу прочитать это как утверждение о том, что единственное изменение касается объекта markup (в этом случае вы не нарушаете условие документа о том, что в Spannable нет изменений).

Это плохой хак, который сломается как веточка в следующем выпуске? Или вызов setSpan() каким-то образом освобождается от документа «не изменять это» для getText()?

(Другое обновление: в FAQ явно указано, как это сделать:http://developer.android.com/resources/faq/commontasks.html , поэтому я думаю, что это просто вводящий в заблуждение документ.)

Ответ №1:

TextView.getText() возвращает CharSequence , а не Spannable , поэтому вы не можете предположить, что результат будет Spannable . Даже если это так Spannable , изменение интервалов не повлияет TextView на визуальное представление. И, конечно, такие предположения не следует делать, потому что Android — это система с открытым исходным кодом, и каждый производитель может ее как-то модифицировать. Поэтому вам не следует полагаться на детали реализации.

Комментарии:

1. TextView гарантирует, что он возвращает Spannable; ознакомьтесь с документацией для Android:BufferType .

2. Я отредактировал исходный вопрос, чтобы рассказать о том, действительно ли setSpan изменяет Spannable.

3. TextView гарантирует, что он возвращает a Spannable только в том случае, если его тип буфера установлен в spannable или editable . Если вы просто установите для a String значение a TextView и не измените тип буфера, то будет возвращена эта строка, но не a Spannable .

4. Во-первых, спасибо за вашу ссылку. Кажется, что можно добавлять промежутки к результату, TextView.getText() если он приводит к Spannable . Я просмотрел исходные тексты и понял, почему. Интервалы и их позиции хранятся в отдельном массиве, поэтому они не влияют на текстовый буфер. SpanStringInternal уведомляет об изменениях диапазона с помощью SpanWatcher интерфейса. TextView реализует этот интерфейс таким образом, что он перерисовывается при изменении интервалов. Это означает, что я был неправ в своем ответе, и этот способ изменения стилей не нарушает никаких правил из документов.