web-dev-qa-db-ja.com

テキストを書き込まずに、AutocompleteTextViewのすべてのアイテムを表示します

AutocompleteTextViewがあり、正常に動作します。 Wordを作成すると、関連する結果が表示されますが、AutocompleteTextViewでWordを作成せずにすべてのアイテムを表示したいです。どうやってやるの。

43

AutoCompleteTextViewを拡張する必要があります。

「しきい値が0以下の場合、1のしきい値が適用されます。」.

setThreshold

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メソッド)。

この例を見てください

74
Talha

より良いソリューションはこちら

AutoCompleteTextViewをカスタマイズする必要はありません。代わりに、autoCompleteTextView.showDropDown()を呼び出してください。

39
Melbourne Lopes

わたしにはできる:

次のイベントメソッドをオブジェクトに追加します。

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

これは私にとって完璧に機能します、これは問題を解決する簡単な方法です:

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;
    }
});
12
Ho Luong

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;
        }
    });
4
Hemant Shori

これを使って :

 text.setOnTouchListener(new View.OnTouchListener(){


            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                // TODO Auto-generated method stub
                text.showDropDown();
                return false;
            }
            });
4
user6920004
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()
}
0
Wajid Ali

他のソリューションが機能しない場合は、代わりにこれを試してください。ポップアップが表示されます常にクリック時に。

   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();
    }
}
0
Jan Moravec

ここで、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>
0