J'ai un AutocompleteTextView et cela fonctionne bien. Lorsque j'écris un mot, il affiche le résultat pertinent, mais je souhaite afficher tous les éléments sans écrire de mot dans AutocompleteTextView. Comment puis je faire ça.
Vous devez étendre AutoCompleteTextView,
"Lorsque le seuil est inférieur ou égal à 0, un seuil de 1 est Appliqué.".
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 && getFilter()!=null) {
performFiltering(getText(), 0);
}
}
}
en xml
<AutoCompleteTextView ... /> to <your.namespace.InstantAutoComplete ... />
EDIT 1
Créez une nouvelle classe nommée InstantAutoComplete, puis insérez ce code dans la classe.
Dans votre mise en page XML, utilisez cette classe comme
puis trouvez ce widget dans votre activité (méthode onCreate).
MEILLEURE SOLUTION ICI
Vous n'avez pas besoin de personnaliser votre AutoCompleteTextView
. Au lieu de cela, appelez simplement autoCompleteTextView.showDropDown()
quand vous en avez besoin .....
Ça marche pour moi:
ajoutez à votre objet les méthodes d'événement suivantes:
myView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
myView.showDropDown();
}
});
myView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
myView.showDropDown();
return false;
}
});
Cela fonctionne parfaitement pour moi, c’est un moyen facile de résoudre le problème:
final ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), Android.R.layout.simple_dropdown_item_1line, usernameLists);
etUsername.setThreshold(1);
etUsername.setAdapter(adapter);
etUsername.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View paramView, MotionEvent paramMotionEvent) {
if (usernameLists.size() > 0) {
// show all suggestions
if (!etUsername.getText().toString().equals(""))
adapter.getFilter().filter(null);
etUsername.showDropDown();
}
return false;
}
});
vous devez appeler requestFocus (); pour afficher le clavier sinon le clavier ne s'affiche pas.
méthode avec force afficher la liste déroulante.
autocomptv.setOnTouchListener(new OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View paramView, MotionEvent paramMotionEvent) {
// TODO Auto-generated method stub
autocomptv.showDropDown();
autocomptv.requestFocus();
return false;
}
});
utilisez ceci :
text.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
text.showDropDown();
return false;
}
});
Si d'autres solutions ne fonctionnent pas, essayez plutôt ceci. Popup est affiché toujours au clic.
public class InstantAutoComplete extends AppCompatAutoCompleteTextView {
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
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
performClick();
}
return super.onTouchEvent(event);
}
@Override
public boolean performClick() {
if (getFilter() != null && !isPopupShowing()) {
performFiltering(getText(), 0);
showDropDown();
}
return super.performClick();
}
}
Ici, une approche avec onclicklistener comme j'ai trouvé tat onTouch était un peu irritante lorsque j'essayais de faire défiler. mOccupation est la vue AutocompleteTextView en question.
mOccupation=(AutoCompleteTextView) findViewById(R.id.actv_occupation);
ArrayAdapter<String> occupationAdapter=new ArrayAdapter<String>
(NewClientActivity.this,
Android.R.layout.simple_list_item_1,
getResources().getStringArray(R.array.occupation_array));
mOccupation.setAdapter(occupationAdapter);
mOccupation.setKeyListener(null);
mOccupation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//mOccupation.setText(null);
((AutoCompleteTextView) view).showDropDown();
return;
}
});
J'ai réussi à tout mettre dans un Textinputlayout avec les spécifications XML suivantes:
<Android.support.design.widget.TextInputLayout
Android:id="@+id/lo_occupation"
Android:layout_marginTop="10dp"
Android:layout_gravity="center_horizontal"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<AutoCompleteTextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="occupation"
Android:focusableInTouchMode="false"<--this is the important part
Android:id="@+id/actv_occupation"
Android:ems="10"
Android:completionThreshold="0"<--this too
/>
</Android.support.design.widget.TextInputLayout>