2009-12-27 4 views
1

Что бы я хотел сделать, это изменить состояние (на самом деле, фон) EditText, чтобы отразить правильность его содержимого. Например. если пользователь входит в 999, где 999 является контекстуально недействительным, EditText должен иметь красную рамку вместо оранжевой границы по умолчанию, аналогично тому, как текст действителен, она должна иметь зеленую границу.Android: возможность просмотра/рисования пользовательских стилей?

Методы я исследовал:

  1. Изменение стиля EditText программно через что-то вроде editor.setStyle (R.styles.SomeID). Кажется, это невозможно в андроиде.
  2. Добавление пользовательских состояний (state_valid, state_invalid) в R.attr, связывание их с красными/зелеными 9-патчами, а затем вызов drawable.setState() с одним из этих состояний. Это работало в том смысле, что состояние можно было прочитать через getState(), но граница не меняла цвет.
  3. Установка фона ресурса непосредственно при обнаружении (в) действительности. Это работает нормально, вызывая правильный визуальный эффект, но кажется немного хоккеем и допускает только одно состояние (например, мне нужно вручную проверить, нажата ли клавиша EditText, включена ли и т. Д.).

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

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

ответ

1

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

+0

Спасибо за ответ. Моя проблема с третьим подходом заключается в том, что я должен выполнить определенную работу для проверки каждого состояния или комбинации, например. EditText может быть нажата-разрешена, или недопустима, и недействительна, и т. д., в результате чего мой подкласс должен проверить каждую возможную комбинацию, чтобы отобразить правильный фон. Это кажется неуклюжим и неэлегантным, не говоря уже о нарушении СУХОЙ. – Simon

2

Я бы рекомендовал изменить цвет текста, чтобы указать срок действия, а не изменять цвет кольца фокусировки с помощью любого из описанных вами методов (из которых только # 3 кажется практичным).

Другая возможность - попробуйте setCompoundDrawablesWithIntrinsicBounds(), чтобы изменить значок слева или справа страницы EditText, чтобы указать срок действия. Я помню, как обсуждал эту технику с кем-то несколько месяцев назад и забыл, получили ли они ее работу или нет.

И, конечно, еще один вариант - не допускать недопустимый ввод через пользовательский входной фильтр или прослушиватель или что-то в этом роде.

+1

Спасибо за ваш ответ. Изменение цвета текста является, конечно, вариантом, но приводит к менее тонкому эффекту IMO. Аналогично, изменение значка для обозначения (в) действительности означает, что обратная связь не возникает в точке любого несоответствия, что является плохим интерфейсом. Наконец, применение фильтра здесь не является вариантом, поскольку вход может стать действительным с последующими символами, такими как частично полный номер телефона. – Simon

+1

«Аналогичным образом, изменение значка для обозначения (в) означает, что обратная связь не возникает в точке любого несоответствия, что является плохим интерфейсом». Это не то, что я написал. Мое предлагаемое решение (если вы его работаете) предлагает превосходный интерфейс IMHO - вместо того, чтобы пользователи должны угадать, что изменение цветов фонового кольца означает изменение действительности, вы можете использовать более визуально мощный значок прямо в EditText, который считается недействительным. – CommonsWare

0

я думаю, что призыв к invalidateDrawable (yourDrawable) будет работать с подъездным номером 2. я не пробовал .. но это имеет смысл

Смежные вопросы