studio how google edittext developers busqueda autocompletar android autocompletetextview

how - autocompletetextview android developers



Android: ¿Restrinja al usuario para que no seleccione sugerencias de autocompletado? (4)

Aquí hay una solución bastante sencilla:

Puede crear una variable para almacenar el valor seleccionado configurando setOnItemClickListener en su AutoCompleteTextView . Luego, puede null ese valor cada vez que un usuario TextWatcher en el campo agregando un TextWatcher . Finalmente, puede validar que su variable no es nula antes de continuar.

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) {} });

He proporcionado un AutoCompleteTextView para mostrar sugerencias al usuario. En función del elemento seleccionado por el usuario, obtengo el ID del elemento y lo uso en el lado de la base de datos. Ahora mi problema es forzar al usuario a hacer la selección solo desde AutoCompleteTextView (es decir, el usuario no debe ingresar su propio texto). Es un requisito del cliente. ¿Como hacer esto?


Ok, supongo que le gustaría limitar la entrada del usuario a los textos que figuran en la lista de elementos enumerados en el cuadro de sugerencias.

Por ejemplo, si tiene:

  • Uno
  • Dos
  • Tres

entonces el usuario solo podría escribir para el primer carácter "O" y "T". Y así sucesivamente según el texto introducido anteriormente.

Para lograr esto, puede utilizar el método setFilters de TextView :

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

Además, es probable que necesite la escucha de cambio de texto y la escucha de enfoque para reaccionar y actualizar la lista filtrada cuando se ingresa un nuevo carácter ... más para actualizar el filtro.

Aquí hay un ejemplo de filtro de número decimal que he usado en un proyecto:

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


Resulta que necesito tal requisito para un proyecto en el que estoy trabajando, y pensé en compartirles la forma en que implementé lo requerido.

Agregué un escucha de cambio de enfoque para la vista de autocompletar de texto y verifiqué cuando el usuario cambió el enfoque por cambio de autocompletar, y manejé la situación de manera directa.

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(""); } } });

Por lo tanto, mi implementación es: si el texto escrito no existe en el adaptador de matriz, en el foco se modificó la vista de texto y, más adelante, al pasar a la siguiente etapa de dicho registro, verifique si esta vista de texto está vacía o no.

Espero que este enfoque ayude a alguien.

Feliz codificacion


NiceAutoCompleteTextView le dará la posibilidad de verificar si se realizó una selección desde la ventana emergente desplegable, invocando isSelectionFromPopup()