인 스 턴 스 설명 Android 의 AutoComplete TextView 자동 완성 구성 요소

9983 단어 Android자동 완성
AutoComplete TextView 는 자동 완성 기능 을 가 진 EditView 입 니 다.사용자 가 데 이 터 를 입력 하면 AutoComplete TextView 는 사용자 가 입력 한 데 이 터 를 자신의 adapter 의 데이터 와 비교 합 니 다.사용자 데이터 가 adapter 의 특정한 데이터 의 시작 부분 과 완전히 일치 하면 adapter 의 이 데 이 터 는 드 롭 다운 알림 상자 에 나타 납 니 다.
그 상용 속성 정 의 는 다음 과 같다.

<AutoCompleteTextView
  android:id="@+id/mp002_top_place_input"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:completionThreshold="1"
  android:layout_marginTop="5dp" >
</AutoCompleteTextView>
그 중에서 android:completionThreshold 는 몇 번 째 문자 부터 후보 목록 을 표시 하 는 것 을 정의 합 니 다.
기본 값 은 2 입 니 다.
사용 예:

AutoCompleteTextView mPlace = (AutoCompleteTextView)findViewById(R.id.mp002_top_place_input);
ArrayList<String> result = new ArrayList<String>();
result.add("1111111");
result.add("1222222");
mPlace.setAdapter(new ArrayAdapter<String>(
   MP002TopActivity.this,
   android.R.layout.simple_dropdown_item_1line,
   result)
);
 
한계 성 은 completionThreshold 가 설정 한 최소 값 은 1 입 니 다.
1 보다 작은 경우 에는 기본적으로 1 이 됩 니 다.
 
따라서 어떤 문자 도 입력 하지 않 은 조건 에서 후보 목록 을 표시 해 야 합 니 다.
AutoComplete TextView 라 는 컨트롤 을 다시 불 러 와 야 합 니 다.
 

public class MyAutoCompleteTextView extends AutoCompleteTextView{
 public MyAutoCompleteTextView(Context context) {
  super(context);
 }
 public MyAutoCompleteTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 public MyAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 @Override
 public boolean enoughToFilter() {
  return true;
 }
 @Override
 protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
  super.onFocusChanged(focused, direction, previouslyFocusedRect);
  performFiltering(getText(), KeyEvent.KEYCODE_UNKNOWN);
 }
}
enough ToFilter()는 입력 한 텍스트 열의 길이 가 현실 후보 목록 의 요 구 를 충족 시 키 는 지 판단 하 는 방법 이다.
onFocusChanged()는 컨트롤 이 초점 을 맞 출 때 후보 목록 을 표시 합 니 다.
2016520154213136.jpg (490×454)
AutoComplete TextView 를 사용 하여 메 일 주소 완성 실현
예 를 들 어 adapter 에 3 개의 데이터"abc","hjk","abd"가 있 고 사용자 가"ab"를 입력 하면 드 롭 다운 알림 상자 에"abc"와"abd"가 나타 납 니 다.(AutoComplete TextView 는 기본적으로 사용자 가 두 문 자 를 입력 한 후에 야 알림 을 표시 합 니 다.setThreshold(1)를 통 해 사용자 가 한 문 자 를 입력 한 후에 알림 을 시작 할 수 있 습 니 다)
AutoComplete TextView 는 사용자 가 데 이 터 를 입력 할 때 permFiltering 방법 을 사용 하여 사용자 데 이 터 를 전송 하고 adapter 의 filter 를 호출 합 니 다.
사용자 가 드 롭 다운 목록 의 한 항목 을 선택 하면 AutoComplete TextView 는 해당 어댑터 의 데 이 터 를 사용 하여 텍스트 필드 를 채 웁 니 다.이것 은 우리 쪽 의 요구 와 다 릅 니 다.우리 adapter 에는'@163.com'과 유사 한 email 주소 접미사 만 있 기 때 문 입 니 다.드 롭 다운 상자 의 데 이 터 는 사용자 입력 과 adapter 의 데 이 터 를 연결 합 니 다.따라서 사용자 가 어떤 항목 을 선택 할 때 지정 한 텍스트 로 텍스트 필드 를 채 울 수 있 도록 replace Text 방법 을 다시 써 야 합 니 다.
그 다음 에 우 리 는 AutoComplete TextView 에 OnFocusChange Listener 를 설정 하여 사용자 가 초점 을 옮 긴 후에 이메일 주소 형식 검 사 를 하고 다시 초점 을 얻 은 후에 알림 기능 을 다시 시작 해 야 합 니 다.
코드 는 다음 과 같 습 니 다.(Email AutoComplete TextView.java)

public class EmailAutoCompleteTextView extends AutoCompleteTextView {
  private static final String TAG = "EmailAutoCompleteTextView";

  private String[] emailSufixs = new String[] { "@163.com",
    "@gmail.com", "@hotmail.com" };

  public EmailAutoCompleteTextView(Context context) {
    super(context);
    init(context);
  }

  public EmailAutoCompleteTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
  }

  public EmailAutoCompleteTextView(Context context, AttributeSet attrs,
      int defStyle) {
    super(context, attrs, defStyle);
    init(context);
  }
  
  public void setAdapterString(String[] es) {
    if(es != null && es.length > 0)
      this.emailSufixs = es;
  }
  
  private void init(final Context context) {
    //adapter      emailSufixs    ,    setAdapterString   
    this.setAdapter(new EmailAutoCompleteAdapter(context, R.layout.auto_complete_item, emailSufixs));
    
    //     1            
    this.setThreshold(1);

    this.setOnFocusChangeListener(new OnFocusChangeListener() {
      
      @Override
      public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
          String text = EmailAutoCompleteTextView.this.getText().toString();
          //            ,      
          if(!"".equals(text))
            performFiltering(text, 0);
        } else {
          //         ,    email     
          EmailAutoCompleteTextView ev = (EmailAutoCompleteTextView) v;
          String text = ev.getText().toString();
          //          :)
          if(text != null && text.matches("^[a-zA-Z0-9_]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+$")) {
            Toast to = new Toast(context);
            ImageView i = new ImageView(context);
            i.setBackgroundResource(R.drawable.img_success);
            to.setView(i);
            to.show();
          } else {
            Toast toast = Toast.makeText(context, "         ", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.TOP, 0, 50);
            toast.show();
          }
        }
      }
    });
  }
  
  

  @Override
  protected void replaceText(CharSequence text) {
    //             ,android     AutoCompleteTextView Adapter          
    //    Adapter       email   
    //     replace  ,             
    Log.i(TAG + " replaceText", text.toString());
    String t = this.getText().toString();
    int index = t.indexOf("@");
    if(index != -1)
      t = t.substring(0, index);
    super.replaceText(t + text);
  }

  @Override
  protected void performFiltering(CharSequence text, int keyCode) {
    //               ,        adapter      ,    
    //adapter        ,  adapter               
    Log.i(TAG + " performFiltering", text.toString() + "  " + keyCode);
    String t = text.toString();
    
    //         ,     ,    ,    adapter         "@163.com"
    //     ,     super.performFiltering ,       "@"      
    int index = t.indexOf("@");
    if(index == -1) {
      if(t.matches("^[a-zA-Z0-9_]+$")) {
        super.performFiltering("@", keyCode);
      }
      else
        this.dismissDropDown();//            ,       
    } else {
      super.performFiltering(t.substring(index), keyCode);
    }
  }

  
  private class EmailAutoCompleteAdapter extends ArrayAdapter<String> {

    public EmailAutoCompleteAdapter(Context context, int textViewResourceId, String[] email_s) {
      super(context, textViewResourceId, email_s);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      Log.i(TAG, "in GetView");
      View v = convertView;
      if (v == null)
        v = LayoutInflater.from(getContext()).inflate(
            R.layout.auto_complete_item, null);
      TextView tv = (TextView) v.findViewById(R.id.tv);
      
      String t = EmailAutoCompleteTextView.this.getText().toString();
      int index = t.indexOf("@");
      if(index != -1)
        t = t.substring(0, index);
      //         adapter  email     ,       
      tv.setText(t + getItem(position));
      Log.i(TAG, tv.getText().toString());
      return v;
    }
  }
}

activity 의 xml 파일 은 다음 과 같 습 니 다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

  <com.example.testautocompletetextview.EmailAutoCompleteTextView
    android:id="@+id/act"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Email Address"
    android:textColor="@color/black" />

  <!--          -->
  <EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:drawableLeft="@drawable/amount_selected" />

</LinearLayout>
         (TextView) xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/tv"
  android:padding="8dp"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" />

알림 캡 처:
2016520154313953.png (477×800)
2016520154329915.png (481×802) 2016520154344679.png (481×767)

좋은 웹페이지 즐겨찾기