ปิดแป้นพิมพ์เสมือนเมื่อกดปุ่ม


133

ฉันมีActivityกับปุ่มและEditText ListViewจุดประสงค์คือการพิมพ์หน้าจอค้นหาในEditTextกดปุ่มและให้ผลการค้นหาเติมรายการนี้

ทั้งหมดนี้ทำงานได้อย่างสมบูรณ์ แต่แป้นพิมพ์เสมือนทำงานแปลก ๆ

ถ้าฉันคลิกEditTextฉันจะได้รับแป้นพิมพ์เสมือนจริง ถ้าฉันคลิกปุ่ม "เสร็จสิ้น" บนแป้นพิมพ์เสมือนปุ่มนั้นจะหายไป อย่างไรก็ตามหากฉันคลิกปุ่มค้นหาของฉันก่อนที่จะคลิก "เสร็จสิ้น" บนแป้นพิมพ์เสมือนแป้นพิมพ์เสมือนจะยังคงอยู่และฉันไม่สามารถกำจัดมันได้ การคลิกปุ่ม "เสร็จสิ้น" ไม่ได้เป็นการปิดแป้นพิมพ์ มันเปลี่ยนปุ่ม "เสร็จสิ้น" จาก "เสร็จสิ้น" เป็นลูกศรและยังคงมองเห็นได้

ขอบคุณสำหรับความช่วยเหลือของคุณ

คำตอบ:


306
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

ฉันใส่สิ่งนี้ทันทีหลังonClick(View v)งาน

คุณจำเป็นต้องนำเข้าandroid.view.inputmethod.InputMethodManager;

แป้นพิมพ์จะซ่อนเมื่อคุณคลิกปุ่ม


55
หมายเหตุ: (ในกรณีที่คุณต้องการใช้วิธีนี้ในกรณีที่อาจไม่มีโฟกัส (เช่น onPause () ฯลฯ ): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai

5
คุณต้องนำเข้าบริบทด้วย
Si8

4
ข้อควรระวัง: โยน NPE หากแป้นพิมพ์ถูกซ่อนไว้แล้ว ทำตามความคิดเห็นของ Peter เพื่อหลีกเลี่ยงสิ่งนี้
Don Larynx

เหตุใดแป้นพิมพ์จึงปรากฏขึ้นหลังจากคลิกปุ่มที่ไม่เกี่ยวข้อง ใครช่วยให้คำอธิบายหรือลิงค์ได้ไหม
kommradHomer

1
ใช้งานได้อย่างมีเสน่ห์!
ARiF

59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});

มันเหมาะกับฉัน ขอบคุณ!
Aman Goyal

29

ใช้รหัสด้านล่าง

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

2
จับข้อยกเว้นแทนการตรวจสอบโมฆะธรรมดา ๆ อย่างจริงจัง!
Dr Glass

ทำงานให้ฉันซ่อนแป้นพิมพ์เมื่อคลิกปุ่ม
ashishdhiman2007

วิธีง่ายๆในสิ่งที่ฉันต้องการ: ซ่อนแป้นพิมพ์หลังจากคลิกปุ่มค้นหา
dawoodman71

13

คุณควรใช้OnEditorActionListenerสำหรับ EditView ของคุณ

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

และคุณซ่อนแป้นพิมพ์โดย:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

คุณควรปิดแป้นพิมพ์ที่ซ่อนอยู่ในปุ่มของคุณโดยใช้ onClickListener

ตอนนี้การคลิก 'เสร็จสิ้น' บนแป้นพิมพ์เสมือนและปุ่มจะทำเช่นเดียวกัน - ซ่อนแป้นพิมพ์และดำเนินการคลิก


ยอดเยี่ยม แต่ฉันไม่ค่อยได้ติดตาม ฉันคิดว่าโพสต์นั้นกินโค้ดบางส่วน (ไม่มีอะไรเลยหลังจาก "โมฆะสาธารณะ" ในตัวอย่างของคุณ) ฉันพยายาม setOnEditorActionListner ในเมธอด onCreate ของกิจกรรม แต่ไม่รู้ว่า setOnEditorActionListener คืออะไร ฉันได้รับการแจ้งเตือน "Anonymous inner type" (ฉันกำลังทำสิ่งนี้ในเมธอด Activity onCreate ของฉัน) i37.tinypic.com/6ozkig.png
Andrew

1
ดูเหมือนว่าจะมีข้อผิดพลาดสองสามข้อในโค้ดนี้ แต่เป็นความคิดที่ถูกต้อง ประการหนึ่งอินเทอร์เฟซ OnEditorActionListener เป็นคลาสภายในดังนั้นคุณต้องอิมพอร์ตอย่างชัดเจน (Eclipse จะไม่ทำเพื่อคุณในกรณีนี้) หรืออ้างถึงเป็นTextView.OnEditorActionListener.
MatrixFrog

ฉันมีปัญหาเล็กน้อย ฉันได้ติดตั้ง onEditorActionListener (คลาสสาธารณะ SearchActivity ขยาย ListActivity ใช้ OnClickListener, OnEditorActionListener) ฉันได้แนบ Listener เข้ากับ EditText ของฉัน (mSearchText.setOnEditorActionListener (นี้);) แต่ Eclipse จะไม่อนุญาตให้ฉันแทนที่ booleanitor แบบสาธารณะ (handlerAction onEdction (TextView v, int actionId, เหตุการณ์ KeyEvent)) มันบอกว่าต้องลบล้างเมธอด superclass ความคิดใด ๆ ?
Andrew

สวัสดีคุณสามารถอินไลน์ OnEditorActionListener ได้โดยพิมพ์ yourEditView.setOnEditorActionListener (ใหม่ OnEditorActionListener () {....
pixel

11

เพิ่มรหัสต่อไปนี้ในเหตุการณ์การคลิกปุ่มของคุณ:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

1
ใช้งานได้อย่างมีเสน่ห์!
coderpc

10

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

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
คุณช่วยอธิบายได้ไหมว่าทำไมโซลูชันของคุณถึงใช้งานได้เพื่อให้คนอื่นเข้าใจและเรียนรู้จากมัน ขอบคุณ!
Shawn

แน่นอน Shawn ฉันเพิ่งแก้ไขด้านบนเนื่องจากฉันยังใหม่กับการวางตัวหากยังไม่ชัดเจนเพียงแจ้งให้เราทราบและฉันจะขยายด้วยปุ่ม onclick
Laert

เชื่อฉันว่านี่เป็นหนึ่งในวิธีที่ดีที่สุดในการทำเช่นนี้ ขอบคุณ @Laert
WitVault

10

สำหรับกิจกรรม

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

สำหรับ Fragments ให้ใช้getActivity ()

getActivity (). getSystemService ();

getActivity (). getCurrentFocus ();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

7

โซลูชันนี้เหมาะสำหรับฉัน:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

3

ลองนี่ ...

  1. สำหรับการแสดงแป้นพิมพ์

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    
  2. สำหรับซ่อนแป้นพิมพ์

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    

เมธอด "สำหรับซ่อนแป้นพิมพ์" เป็น toogle (ซ่อนถ้ามองเห็นได้แสดงว่าซ่อนอยู่หรือไม่) ไม่ใช่ซ่อน
Ninja Coding

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

ไฮ! แม้ว่าคำตอบนี้อาจเพียงพอกับความต้องการของ@Andrewแต่ก็จะดีมากหากคุณสามารถอธิบายเพิ่มเติมได้เพื่อให้แน่ใจว่าผู้อ่านในอนาคตจะได้รับประโยชน์อย่างเต็มที่!
derM

1

ตัวอย่าง Kotlin:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

จาก Fragment:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

จากกิจกรรม:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

0

คุณใช้รหัสนี้ในเหตุการณ์คลิกปุ่มของคุณ

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

0

Crash Null Point Exception Fix: ฉันมีกรณีที่แป้นพิมพ์อาจไม่เปิดขึ้นเมื่อผู้ใช้คลิกปุ่ม คุณต้องเขียนคำสั่ง if เพื่อตรวจสอบว่า getCurrentFocus () ไม่ใช่โมฆะ:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

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