how - Android: AutoCompleteTextView muestra sugerencias cuando no se ingresó texto
dropdown autocomplete android (13)
Estoy usando AutoCompleteTextView
, cuando el usuario hace clic en él, quiero mostrar sugerencias incluso si no tiene texto, pero setThreshold(0)
funciona exactamente igual que setThreshold(1)
, por lo que el usuario debe ingresar al menos 1 carácter para mostrar las sugerencias
Aquí está mi clase, la llamo InstantAutoComplete. Es algo entre AutoCompleteTextView y Spinner.
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;
public class InstantAutoComplete extends AutoCompleteTextView {
public InstantAutoComplete(Context context) {
super(context);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused && getAdapter() != null) {
performFiltering(getText(), 0);
}
}
}
Úselo en su xml así:
<your.namespace.InstantAutoComplete ... />
El adaptador no realiza el filtrado inicialmente.
Cuando no se realiza el filtrado, la lista desplegable está vacía.
por lo que es posible que deba obtener el filtrado inicialmente.
Para hacerlo, puede invocar filter()
después de que termine de agregar las entradas:
adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);
El código de Destil funciona genial cuando solo hay un objeto InstantAutoComplete
. Aunque no funcionó con dos , ni idea por qué. Pero cuando puse showDropDown()
(como lo hizo con CommonsWare) en onFocusChanged()
como este:
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
showDropDown();
}
}
resolvió el problema.
Es solo las dos respuestas combinadas correctamente, pero espero que pueda salvar a alguien en algún momento.
Este es un comportamiento documentado : "Cuando el umbral es menor o igual a 0, se aplica un umbral de 1".
Puede mostrar manualmente el menú desplegable a través de showDropDown()
, por lo que tal vez pueda organizar para mostrarlo cuando lo desee. O bien, subclase AutoCompleteTextView
y sobreescriba enoughToFilter()
, devolviendo true
todo el tiempo.
Esto funcionó para mí, pseudo código:
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.showDropDown();
return super.onTouchEvent(event);
}
}
La manera más fácil:
Simplemente use setOnTouchListener y showDropDown ()
AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
text.showDropDown();
return false;
}
});
La respuesta de Destil de arriba casi funciona, pero tiene un error sutil. Cuando el usuario primero enfoca el campo funciona, sin embargo, si se van y vuelven al campo, no mostrarán el menú desplegable porque el valor de mPopupCanBeUpdated seguirá siendo falso desde el momento en que se escondió. La solución es cambiar el método onFocusChanged a:
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
if (getText().toString().length() == 0) {
// We want to trigger the drop down, replace the text.
setText("");
}
}
}
Para hacer CustomAutoCompleteTextView. 1. anular setThreshold, enoughToFilter, método de FocusFrench
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
private int myThreshold;
public CustomAutoCompleteTextView (Context context) {
super(context);
}
public CustomAutoCompleteTextView (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomAutoCompleteTextView (Context context, AttributeSet attrs) {
super(context, attrs);
}
//set threshold 0.
public void setThreshold(int threshold) {
if (threshold < 0) {
threshold = 0;
}
myThreshold = threshold;
}
//if threshold is 0 than return true
public boolean enoughToFilter() {
return true;
}
//invoke on focus
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
//skip space and backspace
super.performFiltering("", 67);
// TODO Auto-generated method stub
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
protected void performFiltering(CharSequence text, int keyCode) {
// TODO Auto-generated method stub
super.performFiltering(text, keyCode);
}
public int getThreshold() {
return myThreshold;
}
}
Puede usar en FocusMessageListener;
TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
TCKimlikNo.showDropDown();
}
}
});
Siete años después, chicos, el problema sigue siendo el mismo. Aquí hay una clase con una función que fuerza esa estúpida ventana emergente para mostrarse en cualquier condición. Todo lo que necesita hacer es establecer un adaptador para su AutoCompleteTextView, agregar algunos datos en él y llamar a la función showDropdownNow()
cualquier momento.
Créditos a @David Vávra. Está basado en su código.
import android.content.Context
import android.util.AttributeSet
import android.widget.AutoCompleteTextView
class InstantAutoCompleteTextView : AutoCompleteTextView {
constructor(context: Context) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun enoughToFilter(): Boolean {
return true
}
fun showDropdownNow() {
if (adapter != null) {
// Remember a current text
val savedText = text
// Set empty text and perform filtering. As the result we restore all items inside of
// a filter''s internal item collection.
setText(null, true)
// Set back the saved text and DO NOT perform filtering. As the result of these steps
// we have a text shown in UI, and what is more important we have items not filtered
setText(savedText, false)
// Move cursor to the end of a text
setSelection(text.length)
// Now we can show a dropdown with full list of options not filtered by displayed text
performFiltering(null, 0)
}
}
}
Simplemente llame a este método al tocar o haga clic en el evento de autoCompleteTextView o donde lo desee.
autoCompleteTextView.showDropDown()
Simplemente pegue esto en su método onCreate en Java
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
this, android.R.layout.simple_spinner_dropdown_item,
getResources().getStringArray(R.array.Loc_names));
textView1 =(AutoCompleteTextView) findViewById(R.id.acT1);
textView1.setAdapter(arrayAdapter);
textView1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View arg0) {
textView1.setMaxLines(5);
textView1.showDropDown();
}
});
Y esto a tu archivo Xml ...
<AutoCompleteTextView
android:layout_width="200dp"
android:layout_height="30dp"
android:hint="@string/select_location"
android:id="@+id/acT1"
android:textAlignment="center"/>
Y crea una matriz en string.xml en Valores ...
<string-array name="Loc_names">
<item>Pakistan</item>
<item>Germany</item>
<item>Russia/NCR</item>
<item>China</item>
<item>India</item>
<item>Sweden</item>
<item>Australia</item>
</string-array>
Y eres bueno para ir.
intentalo
searchAutoComplete.setThreshold(0);
searchAutoComplete.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {//cut last probel
if (charSequence.length() > 1) {
if (charSequence.charAt(charSequence.length() - 1) == '' '') {
searchAutoComplete.setText(charSequence.subSequence(0, charSequence.length() - 1));
searchAutoComplete.setSelection(charSequence.length() - 1);
}
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
//when clicked in autocomplete text view
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.header_search_etv:
if (searchAutoComplete.getText().toString().length() == 0) {
searchAutoComplete.setText(" ");
}
break;
}
}):