Android:AutoCompleteTextViewは、テキストが入力されていない場合に候補を表示します


127

私はを使用AutoCompleteTextViewしています。ユーザーがクリックしたときに、テキストがない場合でも提案を表示したいのですが、setThreshold(0)まったく同じsetThreshold(1)ように機能するため、ユーザーは少なくとも1文字を入力して提案を表示する必要があります。


ここで似たようなことをしています!!! stackoverflow.com/questions/12854336/...
toobsco42

回答:


159

これは文書化された動作です:

場合threshold未満又は0に等しく、1の閾値が適用されます。

を介して手動でドロップダウンshowDropDown()を表示できるので、必要に応じて表示するように配置できます。または、サブクラス化AutoCompleteTextViewしてオーバーライドしenoughToFilter()trueすべての時間を返します。


7
showDropDown()はonClickListenerの設定ではうまく機能するようですが、ユーザーが文字を入力してDelsを返すまで、サブクラスの機能は機能しません。しかし、onClickだけではありません...
amj

9
これは、ビューがフォーカスを取得したときにshowDropDown()を呼び出すOnFocusChangeListenerとの組み合わせで完全に機能します。
Grishka 14

@DavidVávraによる以下の回答に記載されているように、onFocusChangedもオーバーライドする必要があります
Gabriel

4
@commonsWareはshowDropDown()で動作していないafterTextChangedとき.getText().toString().length()==0。WHYYY
Prabs

1
十分にオーバーライドするだけで私は役に立ちます。ありがとうございました!
Fedir Tsapana

121

これが私のクラスInstantAutoCompleteです。これは、間に何かだAutoCompleteTextViewSpinner

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

}

次のようにxmlで使用します。

<your.namespace.InstantAutoComplete ... />

12
それは素晴らしいことです!また、レイアウトXMLファイルではに変更<AutoCompleteTextView ... />する必要があることも指摘しておきます<your.namespace.InstantAutoComplete ... />。私はこれを理解するのに少し時間を失いました:)
Jules Colle

3
素晴らしいクラス-提案はonFocusChangedメソッドにのみあり、「if(focused)」を「if(focused && getAdapter()!= null)」に変更します。
Jacob Tabak

AndroidX、延長androidx.appcompat.widget.AppCompatAutoCompleteTextView
Mahmudul Hasan Shohag

これは、向きの変更時にドロップダウンを表示しません。
Miha_x64

45

最も簡単な方法:

setOnTouchListenerとshowDropDown()を使用するだけです

AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
   @Override
   public boolean onTouch(View v, MotionEvent event){
      text.showDropDown();
      return false;
   }
});

これをさらに良くするには、if(!text.isPopupShowing()){text.showDropDown();を使用します。}
Boldijar Paul

7
あまり一般的ではありませんが、ユーザーがこのEditTextに移動するためにタッチしない場合、これは機能しません。たとえば、ボタン付きのリモコン(Android TVなど)を使用する場合。
Android開発者

2
setOnFocusChangedを使用する必要があります。誰かがキーボードを持ってTABボタンを押すか、マウスを使ってタッチリスナーを呼び出すことはできません。
barwnikk 2015

onTouchListenerは1回のタップで異なる時間に呼び出されます-例:イベントはMotionEvent.ACTION_DOWN、MotionEvent.ACTION_UPのいずれかです。したがって、特定のイベントをチェックしてコードを記述する方がよい
Govind

18

Destilのコードは、InstantAutoCompleteオブジェクトが1つしかない場合に最適です。しかし、2つでは機能しませんでした。しかし、showDropDown()(CommonsWareが推奨するonFocusChanged()ように)このようにすると:

@Override
protected void onFocusChanged(boolean focused, int direction,
        Rect previouslyFocusedRect) {
    super.onFocusChanged(focused, direction, previouslyFocusedRect);
    if (focused) {
        performFiltering(getText(), 0);
        showDropDown();
    }
}

それは問題を解決しました。

これは2つの回答を適切に組み合わせたものですが、誰かの時間を節約できることを願っています。


2
あなたの追加は役に立ちましたが、InstantAutoCompleteにテキストがあり、画面の向きが変更された場合、エラーが発生しました。ウィンドウの可視性をチェックして修正しました。ここに新しいコードを投稿しました:gist.github.com/furycomptuers/4961368
FuryComputers

9

アダプターは、最初はフィルタリングを実行しません。
フィルタリングが実行されていない場合、ドロップダウンリストは空です。
したがって、最初にフィルタリングを実行する必要がある場合があります。

これを行うにはfilter()、エントリの追加が完了した後に呼び出します。

adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);

6

onFocusChangeListenerを使用できます。

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                TCKimlikNo.showDropDown();

            }

        }
    });

6

上記のDestilの答えはほとんど機能しますが、1つの微妙なバグがあります。ユーザーが最初にフィールドにフォーカスを置いたときに機能しますが、ユーザーが離れてフィールドに戻った場合、ドロップダウンは表示されません。これは、mPopupCanBeUpdatedの値が非表示のときからまだfalseであるためです。修正は、onFocusChangedメソッドを次のように変更することです。

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

しかし、これはテキストがリセットされることも意味します(ただし、通常はそれで問題ありません)...
android developer

3

CustomAutoCompleteTextViewを作成します。1. setThreshold、enoughToFilter、onFocusChangedメソッドをオーバーライドする

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

3

それを試してみてください

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

3

autoCompleteTextViewまたは必要な場所のタッチイベントまたはクリックイベントでこのメソッドを呼び出すだけです。

autoCompleteTextView.showDropDown()

0

これは私にとってはうまくいきました、擬似コード:

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


0

これをJavaのonCreateメソッドに貼り付けるだけです

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

        }
    });

そしてこれをあなたのXMLファイルに...

<AutoCompleteTextView
            android:layout_width="200dp"
            android:layout_height="30dp"
            android:hint="@string/select_location"
            android:id="@+id/acT1"
            android:textAlignment="center"/>

そして、Valuesの下のstring.xmlに配列を作成します...

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

そして、あなたは行ってもいいです。


0

7年後、みんな、問題は同じままです。これは、その愚かなポップアップがどのような状況でも自分自身を表示するように強制する関数を持つクラスです。AutoCompleteTextViewにアダプターを設定し、それにデータを追加して、showDropdownNow()いつでも関数を呼び出すだけです。

@DavidVávraへのクレジット。それは彼のコードに基づいています。

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

0

FocusChangeListenerで、チェック

if (hasFocus) {
            tvAutoComplete.setText(" ")

フィルターで、この値をトリムするだけです:

filter { it.contains(constraint.trim(), true) }

このビューに注目すると、すべての提案が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.