Android: разные цвета для разных персонажей в EditText - PullRequest
1 голос
/ 08 ноября 2011

Заранее благодарю за любые ответы.

Я пытаюсь добавить EditText в свое приложение для Android, в котором разные цвета для разных символов, которые вводятся.

Например, Алфавит "A" всегда должен быть синим, а алфавит "b" всегда должен быть зеленым ... и так далее.

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

Ответы [ 4 ]

7 голосов
/ 08 ноября 2011

Как было указано, вы можете применять Spannables к тексту, когда он вводится.Примерно так:

colorEdit.addTextChangedListener(new TextWatcher() {

    String lastText = null;

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        Log.d("", "lastText='" + lastText + "'");
        Log.d("", "s='" + s + "'");
        if (!s.toString().equals(lastText)) {
            lastText = s.toString();

            String res = "";
            char[] split = s.toString().toCharArray();
            for (char c : split) {
                String color = null;
                if (c == 'a') {
                    color = "red";
                } else if (c == 'b') {
                    color = "green";
                } else if (c == 'c') {
                    color = "blue";
                }
                // etc...
                if (color != null) {
                    res += "<font color=\"" + color + "\">" + c
                            + "</font>";
                } else {
                    res += c;
                }
            }
            int selectStart = colorEdit.getSelectionStart();
            int selectEnd = colorEdit.getSelectionEnd();
            colorEdit.setText(Html.fromHtml(res));
            colorEdit.setSelection(selectStart, selectEnd);
        }
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void afterTextChanged(Editable s) {}
});

кое-что на заметку, я называю setText, что, конечно, заставляет onTextChanged снова работать, поэтому я проверяю, что текст действительно изменился.Кроме того, положение курсора не было сохранено правильно, поэтому я также сохраняю и восстанавливаю его.

2 голосов
/ 08 ноября 2011

Вы, вероятно, хотите обернуть каждую букву в свою ForegroundColorSpan .Добавьте TextWatcher и примените Spannables при редактировании текста.

0 голосов
/ 25 сентября 2012

На твоем месте я бы лучше использовал InputFilter. setText() в textWatcher{} onTextChange() есть некоторые проблемы (например, на программной клавиатуре нельзя выбрать национальную букву).

Некоторые проблемы с TextWatcher

Документация

0 голосов
/ 08 ноября 2011

Ваш лучший выстрел, вероятно, переопределяет EditText и пишет свой draw(). Но этот путь кроется в безумии, как это обычно бывает с переопределением встроенных классов представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...