AutocompleteTextViewがあり、正常に動作します。 Wordを作成すると、関連する結果が表示されますが、AutocompleteTextViewでWordを作成せずにすべてのアイテムを表示したいです。どうやってやるの。
AutoCompleteTextViewを拡張する必要があります。
「しきい値が0以下の場合、1のしきい値が適用されます。」.
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);
}
}
}
xmlで
<AutoCompleteTextView ... /> to <your.namespace.InstantAutoComplete ... />
編集1
InstantAutoCompleteという名前の新しいクラスを作成し、このコードをクラスに配置します。
レイアウトxmlでこのクラスを使用します
次に、アクティビティ内でこのウィジェットを見つけます(onCreateメソッド)。
より良いソリューションはこちら
AutoCompleteTextView
をカスタマイズする必要はありません。代わりに、autoCompleteTextView.showDropDown()
を呼び出してください。
わたしにはできる:
次のイベントメソッドをオブジェクトに追加します。
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;
}
});
これは私にとって完璧に機能します、これは問題を解決する簡単な方法です:
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;
}
});
requestFocus()を呼び出す必要があります。キーボードを表示しないと、キーボードがポップアップしません。
メソッドは強制的にドロップダウンリストを表示します。
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;
}
});
これを使って :
text.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
text.showDropDown();
return false;
}
});
Nothing Custom Required.
すべてのソリューションを試しましたが、場合によっては機能しません。例では、1つのソリューションが初めて機能しますが、テキストを削除しても表示されません。そこで、さらに掘り下げて、次の解決策を見つけました。
提案を歓迎します。
XML:
<Android.support.design.widget.TextInputLayout
Android:id="@+id/tl"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<Android.support.v7.widget.AppCompatAutoCompleteTextView
Android:id="@+id/autoComplete"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="Hint Here" />
</Android.support.design.widget.TextInputLayout>
コトリン:
val adapter = ArrayAdapter<BusinessNoResult>(context, Android.R.layout.select_dialog_item, listItems)
autoComplete.setAdapter(adapter)
//threshold specifies the minimum number of characters the user has to type in
//the
//edit box before the drop down list is shown
autoComplete.threshold = 0
//we have to add check for 0 number of character in edit text. When that
//happens, we will show pop up manually
autoComplete.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
//first check if length of input is 0
if(s?.length ?: 0 == 0){
//if you don't use handler with post delay, the API will hide pop
//up, even if you show it. There could be better ways to this, but
//I have implemented this and after 100 millis it gives an animated
//look
Handler().postDelayed({
//manually show drop down
autoComplete.showDropDown()
}, 100) // with 100 millis of delay
}
}
})
//when user focus out the view, drop down vanishes. When come back it will not
//show, so to cover this scenario add following.
autoComplete.setOnFocusChangeListener { _, hasFocus ->
//when gain focus manually show drop down
if(hasFocus)
autoComplete.showDropDown()
}
他のソリューションが機能しない場合は、代わりにこれを試してください。ポップアップが表示されます常にクリック時に。
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();
}
}
ここで、onTouchを見つけたonclicklistenerを使用したアプローチは、スクロールしようとすると少しイライラしました。 mOccupationは、問題のAutocompleteTextViewです。
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;
}
});
次のxml仕様ですべてをTextinputlayoutに入れることができました。
<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>