Android : 텍스트가 입력되지 않은 경우 AutoCompleteTextView에 제안 표시


127

내가 사용하고 AutoCompleteTextView사용자가 클릭 할, 나는 그것이 텍스트가없는 경우에도 제안을 표시 할 때, - 그러나 setThreshold(0)정확하게 작동하는 동일 setThreshold(1)- 사용자가 제안을 표시하는 적어도 하나 개의 문자를 입력해야하므로.


나는 여기에서 비슷한 것을하고 있습니다! stackoverflow.com/questions/12854336/…
toobsco42

답변:


159

이것은 문서화 된 행동입니다 .

경우 threshold미만 또는 0 일, 1 임계 값을 적용한다.

을 통해 드롭 다운을 수동으로 표시 showDropDown()할 수 있으므로 원할 때 표시 할 수 있습니다. 또는 서브 클래스 AutoCompleteTextView및 override enoughToFilter()true항상 반환 합니다.


7
showDropDown는 () 잘 OnClickListener를 최저치를 작업 할 보이지만, 서브 클래스 것은 ... 사용자가 문자를 입력하고 델 그냥 온 클릭하지 편이라는 오는 전까지 작동하지 않습니다
AMJ

9
뷰가 포커스를 얻었을 때 showDropDown ()을 호출하는 OnFocusChangeListener와 함께 완벽하게 작동합니다.
Grishka

또한 @David Vávra
Gabriel

4
@commonsWare은 showDropDown()작동하지 않습니다 afterTextChanged.getText().toString().length()==0. WHYYY
Prabs

1
enoughToFilter를 재정의하면 도움이됩니다. 감사합니다!
Fedir Tsapana

121

여기 내 클래스 InstantAutoComplete 입니다. AutoCompleteTextView와 사이 에있는 항목 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);
        }
    }

}

다음과 같이 XML에서 사용하십시오.

<your.namespace.InstantAutoComplete ... />

12
대단해! 또한 같은 당신의 레이아웃 XML 파일에 당신이 변화해야한다는 점을 지적하는 것 <AutoCompleteTextView ... />까지 <your.namespace.InstantAutoComplete ... />. 나는 이것을 알아내는 데 시간을 잃었다 :)
Jules Colle

3
훌륭한 클래스-제안은 onFocusChanged 메소드에 있으며 "if (초점)"을 "if (초점 && 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).
안드로이드 개발자

2
setOnFocusChanged를 사용해야합니다. 누군가 키보드를 가지고 Tab 키를 누르거나 마우스를 사용하면 터치 리스너가 호출되지 않습니다.
barwnikk

onTouchListener는 한 번의 탭으로 다른 시간에 호출됩니다. 예 : 이벤트는 MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP 일 수 있습니다. 따라서 특정 이벤트를 확인하고 코드를 작성하는 것이 좋습니다.
Govind

18

Destil의 코드는 InstantAutoComplete객체 가 하나만있을 때 잘 작동 합니다. 그래도 두 가지로는 작동하지 않았습니다 . 이유는 모릅니다. 그러나 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
추가가 도움이되었지만 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의 대답은 거의 작동하지만 미묘한 버그가 있습니다. 사용자가 처음으로 필드에 초점을 맞출 때 작동하지만 필드를 떠났다가 다시 돌아 오면 mPopupCanBeUpdated의 값이 숨겨 졌을 때부터 여전히 거짓이므로 드롭 다운을 표시하지 않습니다. 수정은 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에 Array를 만듭니다.

<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() 다음 언제든지 함수를 만하면됩니다.

@David Vá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.