2011-09-22 12 views
10

Me pregunto si es posible agregar funcionalidad a EditText de modo que cuando incluya mi campo recién ampliado en el diseño xml, no tenga que luego agregue cualquier código a la clase Activity para que se comporte de formas específicas.¿Cuál es la forma correcta de extender EditText para darle funcionalidad adicional "predeterminada"?

Por ejemplo, me gustaría crear un campo EditPhone que sea solo un EditText que tenga la función adicional de escuchar eventos clave y modificar el campo para incluir paréntesis y guiones en sus ubicaciones correspondientes.

Por el momento, siempre tengo que incluir el código del oyente y adjuntarlo a la vista, de forma manual. Pero, obviamente, la clase tiene un montón de comportamiento predeterminado que está envuelto en ella (por ejemplo, hace que aparezca el teclado al hacer clic). Entonces, supongo que no debería ser tan difícil, pero no tengo claro cuáles serían los pasos para lograr esto.

Y para ser claro, no necesito ayuda con la función específica del teléfono descrita anteriormente (lo tengo todo resuelto), estoy tratando de entender cómo ampliar la Vista de una manera que toma una funcionalidad adicional de forma predeterminada, para no tener que saturar mis actividades con el mismo código una y otra vez.

Respuesta

24

En realidad, no hay nada complicado en eso. Por lo general, debe aplicar un InputFilter a su EditText en su código y esto haría el trabajo. Pero si usted ve un patrón en eso y quiere una EditarTexto que siempre se comporta de esa manera se puede crear un widget personalizado de esa manera:

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 
    } 
} 

En el diseño de XML sólo tendría que usar la ruta completa a la clase personalizada en lugar EditarTexto:

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

y agregaría el oyente de la llave en el método init? –

+0

Si necesita uno: Sí. Pero la restricción a la entrada de texto se aplica mediante un filtro de entrada. Pero puedes establecer y modificar cualquier cosa que quieras en 'init'. – Knickedi

+0

sí, tendré que buscar en el filtro de entrada para ver si eso se aplica a mi problema; sin embargo, veo lo que estás haciendo y tienes razón ... es bastante fácil :) –

Cuestiones relacionadas