Android: limiti l'utente per select solo dal text di autocompletamento

Ho fornito una window di text automatica per mostrare suggerimenti all'utente. A proposito dell'elemento selezionato dall'utente, ottengo l'id dell'elemento e l'uso nella base di dati. Ora il mio problema è quello di limitare l'utente a effettuare la selezione solo dal text di autocompletamento (ad esempio, l'utente non dovrebbe immettere il proprio text). È un requisito del cliente. Come fare questo?

  • Come rilevare lo scorrimento di webview in android?
  • Espressione regolare di Android - restituisce la string corrispondente
  • Qual è il tipo di account / nome predefinito per i contatti per l'applicazione di contatto Android?
  • selettore che non funziona con la visualizzazione di layout e image
  • Ottenere il messaggio di errore "caricatore di contenuti Android sdk bloccato a 0%"
  • Android NativeActivity
  • Come posso fare Android eliminare le vecchie librerie natali?
  • come cambiare lo background xml in android dynamicmente?
  • Come posso distriggersre il multi-touch e il tiro dalla mia attività
  • Accuratezza dell'accelerometro di Android (navigazione inerziale)
  • Come posso riempire RecyclerView con GridLayoutManager da destra a sinistra
  • Quante colonne di database associate ad un SMS in android?
  • 4 Solutions collect form web for “Android: limiti l'utente per select solo dal text di autocompletamento”

    Ecco una soluzione piuttosto diretta:

    È ansible creare una variabile per memorizzare il valore selezionato impostando setOnItemClickListener nel proprio setOnItemClickListener . Quindi puoi null quel valore each volta che un utente digita nel field aggiungendo un TextWatcher ad esso. Infine, è ansible validationre 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) {} }); 

    Mi è capitato di avere bisogno di un simile requisito per un progetto su cui sto lavorando, e anche se ti condivido ragazzi come ho implementato le richieste.

    Ho aggiunto un ascoltatore di cambiamento di messa a fuoco per la visualizzazione automatica di text e controllato quando l'utente ha cambiato fuoco dal completamento automatico e ha gestito la situazione in maniera diretta.

     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 la mia implementazione è: se il text digitato non esiste nell'adattatore di matrix, allora in focus cambiato vuoto la visualizzazione di text e in seguito quando si continua alla fase successiva di detta logging, controllare se questa visualizzazione di text è vuota o less.

    Spero che questo approccio aiuta qualcuno.

    Buon codice.

    NiceAutoCompleteTextView vi darà la possibilità di controllare se una selezione è stata effettuata dal popup a discesa, invocando isSelectionFromPopup()

    Ok suppongo che si desideri limitare l'input dell'utente per i testi contenuti nell'elenco di elementi elencati nella casella suggerimento.

    Ad esempio se avete:

    • Uno
    • Due
    • Tre

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

    Per raggiungere questo objective è ansible utilizzare il metodo setFilters di TextView :

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

    Inoltre avresti probabilmente bisogno dell'ascoltatore e dell'ascoltatore di cambiamento di text per reactjs e aggiornare l'elenco filtrato quando viene inserito un nuovo carattere … più per aggiornare il filter.

    Ecco un esempio di filter di numero decimale che ho utilizzato in 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; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.