Android Auto Complete, Custom Tokenizer
Bài đăng này đã không được cập nhật trong 3 năm
Trong quá trình lập trình, khi muốn nhập text và tự động nhận được những suggestions có chứa text đó dưới dạng 1 list để chọn, chúng ta có thể tự custom View hoặc một cách đơn giản hơn là sử dụng AutoCompleteTextView và MultiAutoCompleteTextView có sẵn của Android.
List suggestions chỉ xuất hiện khi người dùng nhập đủ số lượng số ký tự được set trong method setThreshold();
Với AutoCompleteTextView thì list suggestions coi toàn bộ text nhập vào là 1 word nên chỉ so sánh với toàn bộ text, còn đối với MultiAutoCompleteTextView thì sẽ show suggestions với từng từ một khi nhập vào, có thể nhập từ đầu tiên, sau đó nhập từ thứ 2 cùng trong đó thì vẫn hiện suggestions. Để phân biệt giữa các từ với nhau thì cần sử dụng 1 method là setTokenizer(), có thể sử dụng Tokenizer được cung cấp sẵn là CommaTokenizer (dấu "," sẽ được dùng để phân biệt các chữ),và Rfc822Tokenizer. Tuy nhiên để tự define cách phân biệt chữ thì cần tự định nghĩa Tokenizer qua interface MultiAutoCompleteTextView.Tokenizer. Ví dụ ở dưới sẽ define qua việc dùng dấu "." để phân biệt các word
Example:
Đầu tiên cần khai báo trong file XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<AutoCompleteTextView
android:id="@+id/act_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<MultiAutoCompleteTextView
android:id="@+id/mact_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Sau đó trong activity, sẽ có 1 list các suggestions để check text và show ra khi nhập text, autoCompleteTextView cần được set adapter chứa list suggestion đó
public class MainActivity extends AppCompatActivity {
private AutoCompleteTextView actView;
private MultiAutoCompleteTextView mactView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actView = (AutoCompleteTextView) findViewById(R.id.act_view);
mactView = (MultiAutoCompleteTextView) findViewById(R.id.mact_view);
String[] countries = {"Việt Nam", "Japan", "Thái Lan", "Korea", "Nga", "Indonesia"};
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, countries);
actView.setAdapter(adapter);
actView.setThreshold(2);
mactView.setAdapter(adapter);
mactView.setThreshold(1);
mactView.setTokenizer(new MultiAutoCompleteTextView.Tokenizer() {
@Override
public int findTokenStart(CharSequence text, int cursor) {
for(int i = cursor; i > 0; i--){
if(text.charAt(i-1) == '.'){
return i;
}
}
return 0;
}
@Override
public int findTokenEnd(CharSequence text, int cursor) {
int length = text.length();
for(int i = cursor; i < length; i++){
if(text.charAt(i-1) == '.'){
return i;
}
}
return 0;
}
@Override
public CharSequence terminateToken(CharSequence text) {
return text;
}
});
}
}
-
Kết quả demo, với AutoCompleteTextView setThreshold(2);
-
Với MultiAutoCompleteTextView, Threshold = 1 và Tokenizer = '.':
Sau khi nhập dấu '.', coi như kết thúc 1 word, sau đó sẽ tính là từ mới và tính suggestions cho text nhập vào:
Tham khảo: http://developer.android.com/intl/vi/reference/android/widget/AutoCompleteTextView.html
http://developer.android.com/intl/vi/reference/android/widget/MultiAutoCompleteTextView.html
Thank you for reading !
All rights reserved