बटन प्रेस पर वर्चुअल कीबोर्ड बंद करें


133

मैं एक है Activityएक साथ EditText, एक बटन और एक ListView। उद्देश्य में एक खोज स्क्रीन टाइप करना है EditText, बटन दबाएं और खोज परिणाम इस सूची को आबाद करते हैं।

यह सब पूरी तरह से काम कर रहा है, लेकिन आभासी कीबोर्ड अजीब व्यवहार कर रहा है।

यदि मैं क्लिक करता EditTextहूं, तो मुझे वर्चुअल कीबोर्ड मिलता है। अगर मैं वर्चुअल कीबोर्ड पर "डन" बटन पर क्लिक करता हूं, तो यह चला जाता है। हालाँकि, अगर मैं वर्चुअल कीबोर्ड पर "Done" पर क्लिक करने से पहले अपना खोज बटन क्लिक करता हूँ, तो वर्चुअल कीबोर्ड स्थिर रहता है और मैं इससे छुटकारा नहीं पा सकता। "संपन्न" बटन पर क्लिक करने से कीबोर्ड बंद नहीं होता है। यह "Done" बटन को "Done" से एक तीर में बदलता है और दृश्यमान रहता है।

आपकी सहायता के लिए धन्यवाद

जवाबों:


304
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);
पीटर Ajtai

5
आपको Context को भी आयात करना होगा।
Si8

4
चेतावनी: यदि कीबोर्ड पहले से छिपा हुआ है तो एनपीई फेंक देता है। इससे बचने के लिए पीटर की टिप्पणी का पालन करें।
डॉन लैरींक्स

एक अप्रासंगिक बटन पर क्लिक करने के बाद कीबोर्ड क्यों दिखाई दे रहा है? किसी को कुछ स्पष्टीकरण या एक लिंक प्रदान कर सकते हैं?
कोमराधोमर

1
आकर्षण जैसा काम करता है!
एआरआईएफ

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

इससे मेरा काम बनता है। धन्यवाद!
अमन गोयल

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
गंभीरता से साधारण नल चेक के बजाय अपवाद को पकड़ने, गंभीरता से ?!
ग्लास पर डॉ ग्लास

मेरे लिए काम करना, बटन क्लिक करने पर कीबोर्ड छुपाता है
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

अब वर्चुअल कीबोर्ड और बटन पर 'डोन' पर क्लिक करने से कीबोर्ड छिप जाएगा और क्लिक एक्शन परफॉर्म करेगा।


बहुत बढ़िया, लेकिन मैं काफी फॉलो नहीं कर रहा हूं। मुझे लगता है कि पोस्ट ने कुछ कोड खा लिया है (आपके नमूने में "सार्वजनिक शून्य" के बाद कुछ भी नहीं है)। मैंने अपनी गतिविधि के ऑनक्रिट विधि मेंOnEditorActionListner को सेट करने का प्रयास किया, लेकिन यह नहीं जानता कि setOnEditorActionListener क्या है। मुझे एक "अनाम आंतरिक प्रकार" की सूचना मिलती है। (मैं अपनी गतिविधि onCreate
एंड्रयू

1
ऐसा लगता है कि इस कोड में कुछ गलतियाँ हैं, लेकिन यह सही विचार है। एक बात के लिए, OnEditorActionListener इंटरफ़ेस एक आंतरिक वर्ग है, इसलिए आपको इसे या तो स्पष्ट रूप से आयात करने की आवश्यकता है (ग्रहण इस मामले में आपके लिए ऐसा नहीं करेगा) या इसे देखें TextView.OnEditorActionListener
मेट्रिक्सफ्रॉग

मुझे थोड़ी तकलीफ हो रही है। मैंने onEditorActionListener (सार्वजनिक वर्ग SearchActivity ने ListActivity implements OnClickListener, OnEditorActionListener) को लागू किया है, मैंने एक श्रोता को मेरे EditText (mSearchText.setOnEditorActionListener (इस);) पर ग्रहण कर लिया है, लेकिन ग्रहण की अनुमति नहीं दी है। (टेक्स्ट वी, इंट एक्शनआईड, कीवेंट इवेंट)। यह कहता है कि यह एक सुपरक्लास विधि को ओवरराइड करना चाहिए। कोई विचार?
एंड्रयू

नमस्ते, आप अपने OnEditorActionListener को अपना EEditView.setOnEditorActionListener (नया OnEditorActionListener () {....
पिक्सेल

11

अपने बटन क्लिक घटना के अंदर निम्नलिखित कोड जोड़ें:

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

1
आकर्षण जैसा काम करता है!
कोडरपीसी

10

चूँकि आपके पास केवल एक संपादित पाठ है, तो उस बटन के भीतर संपादित पाठ पर क्लिक करें और कॉल सिस्टम द्वारा नियंत्रित किया जाता है। यदि आपके पास एक से अधिक एडिटटेक्स्ट हैं तो यह इतना प्रभावशाली नहीं होगा क्योंकि आपको पहले फोकस किए गए एडिटेक्स प्राप्त करने होंगे। लेकिन आपके मामले में यह पूरी तरह से काम करेगा

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
क्या आप इस बात की व्याख्या छोड़ सकते हैं कि आपका समाधान क्यों काम करता है ताकि दूसरे इसे समझ सकें और सीख सकें? धन्यवाद!
शॉन

श्योर शॉन। मैंने अभी शीर्ष संपादित किया है, चूंकि im नया प्रस्तुत करने के लिए यदि यह स्पष्ट नहीं है तो मुझे बताएं और मैं बटन onclick के साथ विस्तार करूंगा
Laert

मेरा विश्वास करो यह ऐसा करने के सबसे सुरुचिपूर्ण तरीकों में से एक है। धन्यवाद @Laert
WitVault

9

गतिविधि के लिए,

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

टुकड़े के लिए, 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. Hide कीबोर्ड के लिए

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

"छुपा कीबोर्ड के लिए" विधि एक टॉगल है (यदि दिखाई दे रहा है तो छिपाएं, दिखाएं कि क्या छिपा हुआ है) छिपा नहीं है,
निंजा कोडिंग

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 की ज़रूरतों को पूरा कर सकता है, यह बहुत अच्छा होगा, यदि आप इसे कुछ स्पष्टीकरण के साथ बढ़ा सकते हैं, तो सुनिश्चित करें कि भविष्य के पाठकों को इसका पूरा लाभ मिल सके!
केंचुल

1

कोटलिन उदाहरण:

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

टुकड़े से:

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

क्रैश नल प्वाइंट अपवाद फिक्स: मेरे पास एक ऐसा मामला था जहां उपयोगकर्ता बटन क्लिक करने पर कीबोर्ड नहीं खोल सकता है। आपको एक स्टेटमेंट लिखना है कि getCurrentFocus () की जांच करने के लिए एक शून्य नहीं है:

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

-2

यदि आप सेट करते हैं android:singleLine="true", तो स्वचालित रूप से बटन कीबोर्ड छुपाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.