2011-09-22 13 views
10

Mi chiedo se sia possibile aggiungere funzionalità a EditText in modo tale che quando includo il mio campo appena esteso nel layout xml, non devo quindi aggiungi qualsiasi codice alla classe Attività per farlo funzionare in modi specifici.Qual è il modo giusto per estendere EditText per dargli ulteriori funzionalità "predefinite"

Ad esempio, mi piacerebbe creare un campo EditPhone che è solo un EditText che ha la caratteristica aggiuntiva di ascoltare eventi chiave e modificare il campo per includere parentesi e trattini nelle posizioni appropriate.

Al momento, devo sempre includere il codice listener e collegarlo alla vista manualmente. Ma ovviamente la classe ha un sacco di comportamenti predefiniti racchiusi in esso (ad esempio, fa apparire la tastiera quando si fa clic). Quindi, immagino che non dovrebbe essere così difficile, ma non sono chiaro su quali sarebbero i passaggi per raggiungere questo obiettivo.

E per essere chiari, non ho bisogno di aiuto con la funzionalità specifica del telefono descritta in precedenza (ho tutto funzionante), sto cercando di capire come estendere View in modo che assuma funzionalità aggiuntive di default, in modo da non dover ingombrare le mie attività con lo stesso codice più e più volte.

risposta

24

In realtà non c'è nulla di complicato in questo. Di solito applicheresti uno InputFilter al tuo EditText nel tuo codice e questo farebbe il lavoro. Ma se si vede un modello in questo e desidera un EditText che si comporta sempre in questo modo si potrebbe creare un custom widget che modo:

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

Nel file XML di layout si dovrebbe semplicemente utilizzare il percorso completo per la classe personalizzata invece EditText:

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

e vorrei aggiungere il listener onkey nel metodo init? –

+0

Se ne hai bisogno: Sì. Ma la restrizione all'input di testo è applicata da un filtro di input. Ma puoi impostare e modificare tutto ciò che vuoi in 'init'. – Knickedi

+0

sì, dovrò cercare nel filtro di input per vedere se questo si applica al mio problema, tuttavia vedo quello che stai facendo e hai ragione ... è piuttosto facile :) –

Problemi correlati