среда, 14 марта 2012 г.

Android: отображение форматированного текста в EditText

Однажды мне понадобилось реализовать выделение цветом текста в EditText. На первый взгляд задача казалась нетривиальной, ведь стандартные механизмы форматирования текста для этого виджета весьма убогие. Методами setTypeface, setTextSize и setTextColor можно менять начертание, размер и цвет всего текста, но не отдельных слов. А ведь как было бы здорово использовать обычную html-разметку и "раскрашивать" отдельные участки текста независимо друг от друга...
Собственно, так мы и сделаем :)

Как загрузить html в EditText?
В этом нам помогут два класса: android.text.Html и android.text.Spanned:

public class SpannedTestActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EditText hello = new EditText(this);
        Spanned s = Html.fromHtml("this is <font color=\"red\">red</font>");
        hello.setText(s);
 
        setContentView(hello);
    }
}

Какие теги можно использовать?
Список этих тегов отсутствует в официальной документации, но если порыться в сети или в исходниках Android, то можно накопать следующее:

a href="...", b, big, blockquote, br, cite, dfn, div align="...", em, font size="..." color="..." face="...", h1-h6, i, img src="...", p, small, strike, strong, sub, sup, tt, u

Как видите, в EditText (как и в его предка TextView, кстати) вполне можно вывести форматированный текст.