Làm cách nào để tạo nút Chỉnh sửa Android 'Hoàn thành' và ẩn bàn phím khi nhấp vào?


115

Khi người dùng nhấp vào EditView, Android sẽ mở bàn phím để người dùng có thể viết vào EditView.

Vấn đề là, khi người dùng viết xong, không có cách nào để ẩn bàn phím. Người dùng phải nhấn nút quay lại để ẩn bàn phím.

Có cách nào để hiển thị một Donenút trên bàn phím sẽ ẩn bàn phím không?


Câu trả lời:


139

Sử dụng TextView.setImeOptions và truyền cho nó ActionDone. giốngtextView.setImeOptions(EditorInfo.IME_ACTION_DONE);


8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
sulai

14
Tôi đã phải thêm textView.singleLine(true)để có được điều này để làm việc lập trình.
Jacksonkr

nhưng điều này không được chấp nhận kể từ Android 2.3
Sumit Kumar Saha

148

Trước tiên, bạn cần đặt android:imeOptionsthuộc tính bằng với actionDoneEditText mục tiêu của bạn như được thấy bên dưới. Điều đó sẽ thay đổi nút 'TRẢ LẠI' trong bàn phím mềm của EditText thành nút 'XONG'.

<EditText 
    android:id="@+id/edittext_done"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Enter some text"
    android:imeOptions="actionDone"
    />

@Michael đã xóa liên kết đó. Cảm ơn
Paresh Mayani

19
Tôi đã phải thêm android:singleLine="true"để có được điều này để hoạt động thông qua xml
Jacksonkr

4
android: singleLine không dùng nữa. Sử dụng Android: maxLines = "1".
FariborZ

Có @FariborZ singleLine hiện không được chấp nhận.
Paresh Mayani

1
Lưu ý quan trọng: singleLine không giống với maxLines. Quan niệm sai lầm này gây ra rất nhiều vấn đề cho mọi người, chúng ta cần lưu ý rằng ở mọi nơi. stackoverflow.com/questions/30879471/ cường
milosmns

86

Bao gồm cả imeOptions singleLine :

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:singleLine="true"
   />

35
android:imeActionLabel="Done" 
android:singleLine="true"

Trong tệp XML hoạt động tốt. Nhưng điều này cũng sẽ khiến cho editTextviệc tiếp tục gõ vào một dòng mà bạn có thể không muốn. Vì vậy, việc thêm theo sau vào mã của bạn sẽ đảm bảo rằng bạn sẽ không phải nhập mọi thứ trên một dòng.

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");

1
Cảm ơn, Demo là vào ngày 12, thời gian là 11:58 và bạn đã khắc phục sự cố của tôi vào 11:59: p
shahzain ali

android: singleLine = "true" đã không được chấp nhận. Vì vậy, sử dụng, android: lines = "1"
Gowtham. R

20

Để nhận được nút thực hiện

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

android:inputType="text" trong xml

Để xử lý xong đã bấm từ bàn phím

    editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
            if(actionId == EditorInfo.IME_ACTION_DONE){
                // Your action on done
                return true;
            }
            return false;
        }
    });

`


14

Dùng cái này:

android:singleLine="true"

Có ... nếu không thì làm thế nào để phân biệt việc đi đến dòng tiếp theo so với việc đóng bàn phím?
jstewart379

Đây là những gì đã kết thúc làm việc cho tôi. Tôi đã quyết định lỗi với việc có actionDonetrong đó, chỉ trong trường hợp một số thiết bị phản ứng khác nhau.
Jacksonkr

10

Sử dụng hai dòng này để EditText

android:imeActionLabel="Done"
android:singleLine="true"

hoặc bạn có thể đạt được nó theo lập trình bằng dòng này.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

7

Nếu thuộc tính không thay đổi cho widget, có thể tốt hơn để sử dụng như android:imeOptions="actionDone"trong xmltệp bố cục .




5

ActionDone được sử dụng khi nhấp vào nút tiếp theo trong bàn phím mà bàn phím thời gian bị ẩn. Sử dụng trong Chỉnh sửa văn bản hoặc AppcompatEdit

XML

1.1 Nếu bạn sử dụng AppCompatEdittext

    <android.support.v7.widget.AppCompatEditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

1.2 Nếu bạn sử dụng Edittext

    <EditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

JAVA

EditText edittext= (EditText) findViewById(R.id.edittext);
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);

5

Tôi phải chỉ ra rằng có rất nhiều người có thể đấu tranh mà không biết vấn đề.

Nếu bạn muốn kb ẩn khi nhấp Donevà bạn đặt android:imeOptions="actionDone"& android:maxLines="1" không cài đặt EditText, inputTypenó sẽ KHÔNG hoạt động như mặc định inputTypecho EditText không "text"như nhiều người nghĩ.

như vậy, chỉ thiết lập inputTypesẽ cung cấp cho bạn những kết quả mà bạn mong muốn bất cứ điều gì những gì bạn đang đặt nó thích "text", "number"... vv.


2

Trên thực tế, bạn có thể đặt văn bản tùy chỉnh cho nút màu xanh nhỏ đó. Trong tệp xml chỉ cần sử dụng

android:imeActionLabel="whatever"

trên EditText của bạn.

Hoặc trong tệp java sử dụng

etEditText.setImeActionLabel("whatever", EditorInfo.IME_ACTION_DONE);

Tôi tùy ý chọn IME_ACTION_DONE làm ví dụ về những gì sẽ xuất hiện trong tham số thứ hai cho chức năng này. Một danh sách đầy đủ của những hành động này có thể được tìm thấy ở đây .

Cần lưu ý rằng điều này sẽ không khiến văn bản xuất hiện trên tất cả các bàn phím trên tất cả các thiết bị. Một số bàn phím không hỗ trợ văn bản trên nút đó (ví dụ: swiftkey). Và một số thiết bị không hỗ trợ nó. Một quy tắc tốt là, nếu bạn thấy văn bản đã có trên nút, điều này sẽ thay đổi nó thành bất cứ điều gì bạn muốn.


2

Giải pháp Kotlin

Cách trực tiếp để xử lý bàn phím ẩn + hành động được thực hiện trong Kotlin là:

// Set action
edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Hide Keyboard
        val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
        true
    }
    false
}

Gia hạn Kotlin

Sử dụng điều này để gọi edittext.onDone {/*action*/}trong mã chính của bạn. Giữ cho nó dễ đọc và dễ bảo trì hơn

edittext.onDone { edittext.hideKeyboard() }

fun View.hideKeyboard() {
    val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

fun EditText.onDone(callback: () -> Unit) {
    // These lines optional if you don't want to set in Xml
    imeOptions = EditorInfo.IME_ACTION_DONE
    maxLines = 1
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

Phần mở rộng bàn phím bổ sung

Nếu bạn muốn nhiều cách hơn để đơn giản hóa việc làm việc với bàn phím (hiển thị, đóng, tập trung): Đọc bài đăng này

Đừng quên thêm các tùy chọn này vào Xml edittext của bạn, nếu không có mã

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Cần inputType="textMultiLine"hỗ trợ? Đọc bài đăng này và không thêm imeOptionshoặc inputTypetrong Xml


0

sử dụng điều này trong quan điểm của bạn

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />

0

Nếu bạn đang sử dụng

android:imeOptions="actionDone" 

sau đó bạn phải sử dụng

android:inputType="text"

sau đó chỉ bạn mới có thể thấy nút Action Done trong Bàn phím.


0

Nếu bạn không muốn có bất kỳ nút nào cả (ví dụ: bạn đang phát triển GUI cho người khiếm thị, nơi vòi không thể được định vị và bạn dựa vào các vòi đơn / đôi / dài):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

Hoặc trong Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.