ฉันจะสร้างปุ่ม 'เสร็จสิ้น' ของ Android EditView และซ่อนแป้นพิมพ์เมื่อคลิกได้อย่างไร


115

เมื่อผู้ใช้คลิกที่EditViewAndroid จะเปิดแป้นพิมพ์เพื่อให้ผู้ใช้สามารถเขียนในไฟล์EditView.

ปัญหาคือเมื่อผู้ใช้เขียนเสร็จแล้วจะไม่มีทางซ่อนแป้นพิมพ์ได้ ผู้ใช้ต้องกดปุ่มย้อนกลับเพื่อซ่อนแป้นพิมพ์

มีวิธีแสดงDoneปุ่มบนแป้นพิมพ์ที่จะซ่อนแป้นพิมพ์หรือไม่?


คำตอบ:


140

ใช้TextView.setImeOptionsและส่งผ่าน actionDone ชอบtextView.setImeOptions(EditorInfo.IME_ACTION_DONE);


8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
sulai

14
ฉันต้องเพิ่มtextView.singleLine(true)เพื่อให้สิ่งนี้ทำงานแบบเป็นโปรแกรมได้
Jacksonkr

แต่สิ่งนี้เลิกใช้แล้วตั้งแต่ Android 2.3
Sumit Kumar Saha

148

ก่อนอื่นคุณต้องตั้งค่าandroid:imeOptionsแอตทริบิวต์ให้เท่ากับactionDoneEditText เป้าหมายของคุณดังที่แสดงด้านล่าง ซึ่งจะเปลี่ยนปุ่ม 'RETURN' ในซอฟต์คีย์บอร์ดของ EditText เป็นปุ่ม 'DONE'

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

@ ไมเคิลลบลิงก์นั้นออก ขอบคุณ
Paresh Mayani

19
ฉันต้องเพิ่มandroid:singleLine="true"เพื่อให้สิ่งนี้ทำงานผ่าน xml
Jacksonkr

4
android: singleLine เลิกใช้งานแล้ว ใช้ android: maxLines = "1"
FariborZ

ใช่ @FariborZ singleLine เลิกใช้งานแล้ว
Paresh Mayani

1
หมายเหตุสำคัญ: singleLine ไม่เหมือนกับ maxLines ความเข้าใจผิดนี้ทำให้เกิดปัญหามากมายสำหรับทุกคนเราจำเป็นต้องทราบว่าทุกที่ stackoverflow.com/questions/30879471/…
milosmns

86

รวมทั้ง 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"

ในไฟล์ XML ใช้งานได้ดี แต่สิ่งนี้จะทำให้editTextพิมพ์เป็นบรรทัดเดียวต่อไปซึ่งคุณอาจไม่ต้องการ ดังนั้นการเพิ่มการติดตามในโค้ดของคุณจะช่วยให้แน่ใจว่าคุณจะไม่ต้องพิมพ์ทุกอย่างในบรรทัดเดียว

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

1
ขอบคุณสาธิตวันที่ 12 เวลา 11:58 น. และคุณแก้ไขปัญหาของฉันเมื่อ 11:59 น.: p
shahzain ali

android: singleLine = "true" เลิกใช้งานแล้ว ดังนั้นใช้ android: lines = "1"
Gowtham ร

20

สำหรับการทำปุ่ม

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

และ

android:inputType="text" ใน xml

สำหรับการจัดการเมื่อคลิกเสร็จแล้วจากแป้นพิมพ์

    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

ใช้สิ่งนี้:

android:singleLine="true"

ใช่ ... ไม่อย่างนั้นจะแยกความแตกต่างไปยังบรรทัดถัดไปกับการปิดแป้นพิมพ์ได้อย่างไร?
jstewart379

นี่คือสิ่งที่ได้ผลสำหรับฉัน ฉันตัดสินใจที่จะเกิดข้อผิดพลาดกับการมีactionDoneอยู่ในนั้นเช่นกันในกรณีที่อุปกรณ์บางอย่างตอบสนองต่างกัน
Jacksonkr

10

ใช้สองบรรทัดนี้กับไฟล์ EditText

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

หรือคุณสามารถบรรลุได้โดยทางโปรแกรมโดยบรรทัดนี้

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

7

หากคุณสมบัติไม่เปลี่ยนแปลงสำหรับวิดเจ็ตมันอาจจะดีกว่าที่จะใช้เหมือน android:imeOptions="actionDone"ในxmlไฟล์เค้าโครง




5

ActionDone ใช้เมื่อคลิกในปุ่มถัดไปในแป้นพิมพ์เวลาที่แป้นพิมพ์ซ่อนอยู่ใช้ใน Edit Text หรือ AppcompatEdit

XML

1.1 หากคุณใช้ 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 หากคุณใช้ 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

ฉันต้องชี้ให้เห็นว่าผู้คนจำนวนมากสามารถต่อสู้กับสิ่งนั้นได้โดยไม่ทราบปัญหา

หากคุณต้องการให้ kb ซ่อนเมื่อคลิกDoneและคุณตั้งค่าandroid:imeOptions="actionDone"& android:maxLines="1" โดยไม่ตั้งค่า EditText ของคุณinputTypeมันจะไม่ทำงานเป็นค่าเริ่มต้นinputTypeสำหรับ EditText นั้นไม่ได้"text"เป็นอย่างที่หลายคนคิด

ดังนั้นการตั้งค่าinputTypeจะให้ผลลัพธ์ที่คุณต้องการในสิ่งที่คุณต้องการ"text"เท่านั้น"number", ... ฯลฯ


2

จริงๆแล้วคุณสามารถตั้งค่าข้อความที่กำหนดเองเป็นปุ่มสีน้ำเงินเล็ก ๆ นั้นได้ ในไฟล์ xml ให้ใช้ไฟล์

android:imeActionLabel="whatever"

บน EditText ของคุณ

หรือในไฟล์ java ใช้

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

ฉันเลือกIME_ACTION_DONEโดยพลการเป็นตัวอย่างของสิ่งที่ควรไปในพารามิเตอร์ที่สองสำหรับฟังก์ชันนี้ รายการเต็มรูปแบบของการกระทำเหล่านี้สามารถพบได้ที่นี่

ควรสังเกตว่าสิ่งนี้จะไม่ทำให้ข้อความปรากฏบนแป้นพิมพ์ทั้งหมดบนอุปกรณ์ทั้งหมด แป้นพิมพ์บางตัวไม่รองรับข้อความบนปุ่มนั้น (เช่น swiftkey) และอุปกรณ์บางอย่างก็ไม่รองรับเช่นกัน กฎที่ดีคือหากคุณเห็นข้อความบนปุ่มอยู่แล้วสิ่งนี้จะเปลี่ยนเป็นสิ่งที่คุณต้องการ


2

โซลูชัน Kotlin

วิธีโดยตรงในการจัดการกับแป้นพิมพ์ซ่อน + ดำเนินการใน Kotlin คือ:

// 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
}

Kotlin ส่วนขยาย

ใช้เพื่อโทรedittext.onDone {/*action*/}ในรหัสหลักของคุณ ช่วยให้อ่านและบำรุงรักษาได้มากขึ้น

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
    }
}

ส่วนขยายแป้นพิมพ์เพิ่มเติม

หากคุณต้องการวิธีอื่น ๆ ในการทำงานกับแป้นพิมพ์ให้ง่ายขึ้น (แสดงปิดโฟกัส): อ่านโพสต์นี้

อย่าลืมเพิ่มตัวเลือกเหล่านี้ใน edittext Xml ของคุณหากไม่มีอยู่ในโค้ด

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

ต้องการinputType="textMultiLine"การสนับสนุน? อ่านโพสต์นี้แล้วอย่าเพิ่มimeOptionsหรือinputTypeใน Xml



0

หากคุณกำลังใช้

android:imeOptions="actionDone" 

จากนั้นคุณต้องใช้

android:inputType="text"

จากนั้นคุณเท่านั้นที่จะเห็นปุ่ม Action Done ในคีย์บอร์ด


0

หากคุณไม่ต้องการปุ่มใด ๆ เลย (เช่นคุณกำลังพัฒนา GUI สำหรับคนตาบอดโดยที่การแตะไม่สามารถวางตำแหน่งได้และคุณต้องใช้การแตะครั้งเดียว / สองครั้ง / ยาว):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

หรือใน Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.