Какой правильный способ расширить EditText, чтобы придать ему дополнительные функции "по умолчанию"

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

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

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

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

Ответ 1

На самом деле в этом нет ничего сложного. Обычно вы применяете 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)" />