Android Auto Complete, Custom Tokenizer

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); Screenshot_2015-12-27-02-15-50.jpg

  • Với MultiAutoCompleteTextView, Threshold = 1 và Tokenizer = '.': Screenshot_2015-12-27-02-16-00.jpg

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: Screenshot_2015-12-27-02-16-09.jpg

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 !