Android의 AutoCommpleteTextView에서는 항상 모든 후보를 차트에 표시합니다.

개요


AndroidAutoCompleteTextView에 모든 후보를 입력 후보에 표시하는 방법이 적혀 있습니다.
예를 들어, 입력 표시줄에 "100"을 입력할 때 AutoCompuleteTextView는 아래 그림의 100과 일치하는 후보만 표시합니다.

이번에는 입력란에 '100' 을 입력해도 모든 후보 내용이 표시됩니다.

이 환경은 Android 8.1, targetSdkVersion 26입니다.

용도


AutoCommpleteTextView는 자동 완성 기능을 제공하여 입력한 텍스트 부분이 일치하는 제안을 열거하고 선택하는 데 사용됩니다.사전에 AutoCommpleteTextView에서 레지스트리에 후보 일람을 표시하는 Adapter를 사용하면 입력한 텍스트와 일치하는 후보가 표시됩니다.
그나저나 텍스뷰로 명명됐지만 상속EditText됐다.왜 이렇게 헷갈리는 이름을 지었을까?
이번에는 입력 내용과 상관없이 모든 후보 기능을 한눈에 볼 수 있도록 실시하기로 했다.요컨대 사용자가 입력할 수 있는Spinner 같은 것을 원합니다.따라서 사용자 입력을 간소화할 수 있다.

메서드


먼저 만들기 Filter (android.widget.Filter).이것은 사용자가 입력할 때 후보 내용을 어떻게 선별하는지 정의합니다.이번에는 모든 것을 압축하지 않기 위해perform Filtering에 비어 있는 Filter Results를 사용합니다.
class SampleArrayFilter extends Filter {
   @Override
   protected FilterResults performFiltering(CharSequence prefix) {
        return new FilterResults();
   }

   @Override
   protected void publishResults(CharSequence constraint, FilterResults results) {
       if (results.count > 0) {
           notifyDataSetChanged();
       } else {
           notifyDataSetInvalidated();
       }
   }
}
그런 다음 어댑터를 만듭니다.이 곳에서 GetFilter 방법을 다시 쓰고 방금 만든 Filter를 되돌려줍니다.(구조기 적절)
class SampleArrayAdapter extends ArrayAdapter<String> {
   public SampleArrayAdapter tArrayAdapter (@NonNull Context context, int textViewResourceId, @NonNull String[] objects) {
       super(context, textViewResourceId, objects);
   }

   @Override
   public Filter getFilter() {
       return new SampleArrayFilter();
   }
}
작성된 어댑터를 AutoCompuleteTextView에 로그인합니다.
String[] sampleArray = {"400", "300", "200", "100", "75", "50", "25"};
SampleArrayAdapter adapter = new SampleArrayAdapter (getContext(), android.R.layout.simple_dropdown_item_1line, sampleArray);
AutoCompleteTextView sammpleView = findViewById(R.id.sampleSpeedEditText);
sammpleView .setAdapter(adapter );
따라서 모든 후보가 자동으로 표시됩니다.

입력하지 않아도 후보 표시


하지만 이런 상태에는 문제가 있다.AutoCommpleteTextView는 표준 상태에서 두 개 이상의 입력 후보를 표시합니다.여러 후보가 나오는 것을 막기 위한 것으로 보인다.이에 비해 setThreshold에 후보를 표시하기 전에 문자 수를 지정할 수 있지만 최소 문자는 1문자이기 때문에 1문자를 입력하지 않으면 후보를 표시할 수 없습니다.
이번 목적은 사용자 입력 상태에서 모든 후보를 표시하고 문자 입력과 후보 선택을 가능하게 함으로써 입력을 간소화하는 것이다.그래서 0자로 표시하고 싶어요.
따라서 다음과 같이 활동 설정을 수행합니다.
sampleView.setThreshold(1);
sampleView.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            sampleView.showDropDown();
        }
    }
});
sampleView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        sampleView.showDropDown();
    }
});
AutoCompuleteTextView의 초점과 클릭을 통해 후보를 강제로 표시합니다.이번에는 두 가지 이벤트를 모두 설정해 UI와 화면 구성에 따라 어느 것이든 괜찮다고 생각한다.
이 방법 외에 AutoCommpleteTextView를 계승하는 반을 만드는 방법도 있다.이 경우 enoughToFilter를 다시 씁니다. setThreshold의 값을 무시하고 실제 값을 되돌려야 합니다.(비록 썼지만 나는 해 본 적이 없다.)

최후


그런 느낌으로 입력을 실현해 보았고 쌍방이 모두 할 수 있는 AutoCompulete TextView를 선택했다.다소 보기 싫은 느낌은 들었지만, 뷰를 만들기 위한 목적이었던 것 같아요.
개인적으로 이 정도의 뷰는 표준으로 준비했으면 좋겠는데 그렇게 생각하지 않는 것도 아니고요.안드로이드 표준 뷰, 가려운 데 닿지 않는 모드가 너무 많아서...

참고 자료

  • AutoCompleteTextView의 구조 조사 - Qita
    https://qiita.com/Horie1024/items/d52ef21c589b135b5c37
  • EditText with a Popup List
    http://maogm.com/blog/edittext-with-popuplist-en.html
  • listview - Custom filtering in Android using ArrayAdapter - Stack Overflow
    https://stackoverflow.com/questions/2718202/custom-filtering-in-android-using-arrayadapter
  • java - AutoCompleteTextView force to show all items - Stack Overflow
    https://stackoverflow.com/questions/11284368/autocompletetextview-force-to-show-all-items/11302820
  • android - Show all items in AutocompleteTextView without writing text - Stack Overflow
    https://stackoverflow.com/questions/15544943/show-all-items-in-autocompletetextview-without-writing-text
  • 좋은 웹페이지 즐겨찾기