2012-11-15 7 views
15

Ho fornito una visualizzazione del testo a completamento automatico per mostrare suggerimenti all'utente. Basato sull'elemento selezionato dall'utente, ottengo l'id dell'elemento e lo utilizzo nel lato del database . Ora il mio problema è di limitare l'utente a fare la selezione solo da textview a completamento automatico (cioè, l'utente non deve inserire il proprio testo). È un requisito del cliente. Come fare questo?Android: Limita l'utente alla selezione dalla sola visualizzazione del testo del completamento automatico

+0

La tua domanda non è chiara. Quale selezione vuoi limitare/dove altro possono gli utenti effettuare una selezione? – stoilkov

+1

Stai tentando di limitare l'utente a modificare la visualizzazione testo ... in modo che possa selezionare solo uno degli elementi nella selezione del completamento automatico? – Drejc

+0

@Drejc sì questo è quello che ho richiesto –

risposta

22

Ecco una soluzione abbastanza semplice:

È possibile creare una variabile per memorizzare il valore selezionato impostando setOnItemClickListener in il tuo AutoCompleteTextView. Quindi puoi null che valore ogni volta che un utente digita sul campo aggiungendo un TextWatcher ad esso. Infine, è possibile convalidare la variabile non è nulla prima di continuare.

String my_var; //keep track! 
AutoCompleteTextView tv = (AutoCompleteTextView) layout.findViewById(R.id.tv); 
tv.setAdapter(my_adapter); 
tv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     my_var = my_adapter.getItem(position).toString(); 
    } 
}); 
/** 
* Unset the var whenever the user types. Validation will 
* then fail. This is how we enforce selecting from the list. 
*/ 
tv.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     my_var = null; 
    } 
    @Override 
    public void afterTextChanged(Editable s) {} 
}); 
+1

ma se l'utente ha digitato il valore che appare nell'elenco, 'my_var' non dovrebbe essere nullo! – dvrm

+0

@dvrm, quindi è necessario cercare nell'adattatore il testo inserito dall'utente e selezionare il valore dall'adattatore su ogni onChanged. Quindi, diciamo che l'utente sta digitando "nome" nell'actv, quindi cercherai "n", "na", "nam", "nome" e quando ottieni una corrispondenza, scegli quel valore. in questo modo l'elemento nella lista sarà scelto sia che lo facciano clic o meno, purché il testo corrisponda a – regretoverflow

+0

brillante applicazione della mente. Grazie. –

1

Ok presumo che si desideri limitare l'input dell'utente ai testi contenuti nell'elenco di elementi elencati nella casella dei suggerimenti.

Per esempio se si dispone di:

  • Uno
  • Due
  • Tre

allora l'utente potrebbe digitare solo per il primo carattere "O" e "T". E così via secondo il testo inserito prima.

per raggiungere questo obiettivo è possibile utilizzare le setFilters metodo di TextView:

editBox = (TextView) findViewById(R.id.editBox); 
editBox.setFilters(getFilters()); 
editBox.addTextChangedListener(this); 
editBox.setOnFocusChangeListener(this); 

Inoltre si sarebbe probabilmente necessario il cambiamento testo ascoltatore e attenzione ascoltatore reagire e aggiornare l'elenco filtrato quando viene inserito un nuovo carattere ... oltre ad aggiornare il filtro.

Ecco un esempio del filtro di numero decimale che ho usato su un progetto:

protected InputFilter[] getFilters() 
    { 
     InputFilter[] filters = new InputFilter[1]; 

     filters[0] = new InputFilter() 
     { 
      public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
      { 
       // limit input to digits and decimal/thousand separator only 
       // in case thousand separator is pressed, change it to decimal 
       // separator instead 
       String output = ""; 

       if (number.isFocused()) 
       { 
        for (int i = start; i < end; i++) 
        { 
         char c = source.charAt(i); 

         if (isDecimalOrThousandSeparator(c)) 
         { 
          output = output + Character.toString(decimalSeparator); 
         } 
         else if (Character.isDigit(c)) 
         { 
          output = output + Character.toString(c); 
         } 
        } 

        return output == "" ? null : output; 
       } 

       return null; 
      } 
     }; 

     return filters; 
    } 
13

mi è capitato di avere bisogno di un tale requisito per un progetto cui sto lavorando, e ho pensato io condividere voi ragazzi il modo in cui ho implementato il richiesto.

Ho aggiunto un listener di cambiamento di messa a fuoco per la visualizzazione del testo a completamento automatico e controllato quando l'utente ha attivato lo stato attivo di messa a fuoco dal completamento automatico e ha gestito la situazione in avanti.

autoTextViewCountry.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean b) { 
      if(!b) { 
       // on focus off 
       String str = autoTextViewCountry.getText().toString(); 

       ListAdapter listAdapter = autoTextViewCountry.getAdapter(); 
       for(int i = 0; i < listAdapter.getCount(); i++) { 
        String temp = listAdapter.getItem(i).toString(); 
        if(str.compareTo(temp) == 0) { 
         return; 
        } 
       } 

       autoTextViewCountry.setText(""); 

      } 
     } 
    }); 

Quindi il mio attuazione è: se il testo digitato non esiste l'adattatore matrice poi a fuoco cambiato svuotare la visualizzazione del testo, e più tardi, quando continuando a prossima fase di registrazione per esempio, controllare se questo punto di vista il testo è vuoto o no

Spero che questo approccio aiuti qualcuno.

Felice codifica.

3

NiceAutoCompleteTextView vi darà la possibilità di verificare se una selezione è stata fatta dal pop-up menu a discesa, invocando isSelectionFromPopup()

Problemi correlati