Chỉ định kiểu phương thức nhập

Thử cách sử dụng Compose
Jetpack Compose là bộ công cụ giao diện người dùng được đề xuất cho Android. Tìm hiểu cách sử dụng thao tác chạm và nhập trong Compose.

Mỗi trường văn bản đều yêu cầu một kiểu nhập văn bản nhất định, chẳng hạn như địa chỉ email, số điện thoại hoặc văn bản thuần tuý. Bạn phải chỉ định kiểu nhập cho mỗi trường văn bản trong ứng dụng của mình để hệ thống hiển thị phương thức nhập mềm thích hợp, chẳng hạn như bàn phím ảo.

Ngoài loại nút có sẵn với phương thức nhập, bạn có thể chỉ định các hành vi như phương thức nhập có cung cấp đề xuất chính tả, viết hoa câu mới hay không và thay thế nút trả lại vị trí đầu dòng bằng nút hành động như Xong hoặc Tiếp theo. Trang này cho biết cách chỉ định các đặc điểm này.

Chỉ định loại bàn phím

Luôn khai báo phương thức nhập cho các trường văn bản bằng cách thêm thuộc tính android:inputType vào phần tử <EditText>.

nhập bằng điện thoại
Hình 1. Kiểu nhập phone.

Ví dụ: nếu bạn muốn dùng phương thức nhập để nhập số điện thoại, hãy sử dụng giá trị "phone":

<EditText
    android:id="@+id/phone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/phone_hint"
    android:inputType="phone" />
Loại mục nhập textPassword
Hình 2. Kiểu nhập textPassword.

Nếu trường văn bản là dành cho mật khẩu, hãy sử dụng giá trị "textPassword" để trường văn bản ẩn thông tin đầu vào của người dùng:

<EditText
    android:id="@+id/password"
    android:hint="@string/password_hint"
    android:inputType="textPassword"
    ... />

Có một số giá trị được ghi nhận bằng thuộc tính android:inputType và bạn có thể kết hợp một số giá trị để chỉ định giao diện của phương thức nhập và các hành vi khác.

Bật tính năng đề xuất chính tả và các hành vi khác

tự động sửa lỗi
Hình 3. Khi bạn thêm textAutoCorrect, tính năng tự động sửa lỗi chính tả.

Thuộc tính android:inputType cho phép bạn chỉ định nhiều hành vi cho phương thức nhập. Điều quan trọng nhất là nếu trường văn bản của bạn là để nhập văn bản cơ bản (chẳng hạn như tin nhắn văn bản), hãy bật tính năng tự động sửa lỗi chính tả bằng giá trị "textAutoCorrect".

Bạn có thể kết hợp nhiều hành vi và kiểu phương thức nhập với thuộc tính android:inputType. Ví dụ: dưới đây là cách tạo một trường văn bản viết hoa từ đầu tiên của câu và cũng tự động sửa lỗi chính tả:

<EditText
    android:id="@+id/message"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType=
        "textCapSentences|textAutoCorrect"
    ... />

Chỉ định thao tác cho phương thức nhập

Hầu hết các phương thức nhập mềm đều cung cấp một nút hành động người dùng ở góc dưới cùng phù hợp với trường văn bản hiện tại. Theo mặc định, hệ thống sẽ sử dụng nút này cho thao tác Next (Tiếp theo) hoặc Done (Xong) trừ phi trường văn bản của bạn hỗ trợ văn bản nhiều dòng (chẳng hạn như với android:inputType="textMultiLine"). Trong trường hợp đó, nút hành động sẽ là phương thức trả lại vị trí đầu dòng. Tuy nhiên, bạn có thể chỉ định các thao tác khác có thể phù hợp hơn với trường văn bản, chẳng hạn như Send (Gửi) hoặc Go (Bắt đầu).

Để chỉ định nút hành động trên bàn phím, hãy sử dụng thuộc tính android:imeOptions có giá trị hành động như "actionSend" hoặc "actionSearch". Ví dụ:

nút gửi
Hình 4. Nút Send (Gửi) sẽ xuất hiện khi bạn khai báo android:imeOptions="actionSend".
<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Sau đó, bạn có thể theo dõi các lượt nhấn vào nút hành động bằng cách xác định TextView.OnEditorActionListener cho phần tử EditText. Trong trình nghe của bạn, hãy phản hồi mã hành động IME thích hợp được xác định trong lớp EditorInfo, chẳng hạn như IME_ACTION_SEND như trong ví dụ sau:

Kotlin

findViewById<EditText>(R.id.search).setOnEditorActionListener { v, actionId, event ->
    return@setOnEditorActionListener when (actionId) {
        EditorInfo.IME_ACTION_SEND -> {
            sendMessage()
            true
        }
        else -> false
    }
}

Java

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

Cung cấp đề xuất tự động hoàn thành

Nếu muốn cung cấp đề xuất cho người dùng khi họ nhập, bạn có thể sử dụng một lớp con của EditText có tên là AutoCompleteTextView. Để triển khai tính năng tự động hoàn thành, bạn phải chỉ định một Adapter cung cấp các đề xuất dạng văn bản. Hiện có một số bộ chuyển đổi, tuỳ thuộc vào nguồn của dữ liệu, chẳng hạn như từ cơ sở dữ liệu hoặc mảng.

đề xuất bằng văn bản
Hình 5. Ví dụ về AutoCompleteTextView có đề xuất dạng văn bản.

Quy trình sau đây mô tả cách thiết lập một AutoCompleteTextView cung cấp đề xuất từ một mảng bằng ArrayAdapter:

  1. Thêm AutoCompleteTextView vào bố cục. Dưới đây là bố cục chỉ có trường văn bản:
    <?xml version="1.0" encoding="utf-8"?>
    <AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/autocomplete_country"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    
  2. Xác định mảng chứa tất cả đề xuất văn bản. Ví dụ: dưới đây là một mảng tên quốc gia:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="countries_array">
            <item>Afghanistan</item>
            <item>Albania</item>
            <item>Algeria</item>
            <item>American Samoa</item>
            <item>Andorra</item>
            <item>Angola</item>
            <item>Anguilla</item>
            <item>Antarctica</item>
            ...
        </string-array>
    </resources>
    
  3. Trong Activity hoặc Fragment, hãy dùng mã sau để chỉ định bộ chuyển đổi cung cấp đề xuất:

    Kotlin

    // Get a reference to the AutoCompleteTextView in the layout.
    val textView = findViewById(R.id.autocomplete_country) as AutoCompleteTextView
    // Get the string array.
    val countries: Array<out String> = resources.getStringArray(R.array.countries_array)
    // Create the adapter and set it to the AutoCompleteTextView.
    ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries).also { adapter ->
        textView.setAdapter(adapter)
    }
    

    Java

    // Get a reference to the AutoCompleteTextView in the layout.
    AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);
    // Get the string array.
    String[] countries = getResources().getStringArray(R.array.countries_array);
    // Create the adapter and set it to the AutoCompleteTextView.
    ArrayAdapter<String> adapter =
            new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries);
    textView.setAdapter(adapter);
    

    Trong ví dụ trước, một ArrayAdapter mới được khởi động để liên kết từng mục trong mảng chuỗi countries_array với một TextView tồn tại trong bố cục simple_list_item_1. Đây là bố cục do Android cung cấp với giao diện chuẩn cho văn bản trong danh sách.

  4. Gán bộ chuyển đổi cho AutoCompleteTextView bằng cách gọi setAdapter().