Какой правильный способ расширить EditText, чтобы дать ему дополнительную функциональность «по умолчанию» - PullRequest
10 голосов
/ 22 сентября 2011

Мне интересно, возможно ли добавить функциональность в EditText таким образом, чтобы при включении моего нового расширенного поля в макет xml мне не нужно было добавлять какой-либо код в класс Activity, чтобы заставить его вести себя определенным образом? пути.

Например, я хотел бы создать поле EditPhone, представляющее собой просто EditText, в котором есть дополнительная функция прослушивания ключевых событий и изменения поля, чтобы включить круглые скобки и тире в соответствующих местах.

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

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

1 Ответ

24 голосов
/ 22 сентября 2011

На самом деле в этом нет ничего сложного.Обычно вы применяете InputFilter к вашему EditText в вашем коде, и это сделает эту работу.Но если вы видите шаблон в этом и хотите EditText, который всегда ведет себя так, вы можете создать собственный виджет следующим образом:

public class PhoneEditText extends EditText {

    public PhoneEditText(Context context) {
        super(context);
        init();
    }

    public PhoneEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PhoneEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
            // set your input filter here
    }
}

В макете XML вы просто используете вместо этого полный путь к вашему пользовательскому классуEditText:

<my.package.path.to.PhoneEditText
   attribute="value (all EditText attributes will work as they did before)" />
...