인 스 턴 스 설명 Android 의 AutoComplete TextView 자동 완성 구성 요소
그 상용 속성 정 의 는 다음 과 같다.
<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()는 컨트롤 이 초점 을 맞 출 때 후보 목록 을 표시 합 니 다.
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" />
알림 캡 처:이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.