एंड्रॉइड सॉफ्ट कीबोर्ड को बंद / छिपाएं


3818

मेरे पास मेरे लेआउट में एक EditTextऔर एक Buttonहै।

एडिट फ़ील्ड में लिखने और पर क्लिक करने के बाद Button, मैं वर्चुअल कीबोर्ड छिपाना चाहता हूं। मुझे लगता है कि यह एक सरल कोड है, लेकिन मैं इसका एक उदाहरण कहां पा सकता हूं?

कीबोर्ड के बाहर छूने पर।


13
यदि आपके पास केवल एक EditText और कई बटन हैं, जैसे चेक बॉक्स और रेडियो? एकमात्र स्थान जो आपको कीबोर्ड की आवश्यकता है वह एकल एडिट टेक्स्ट में है। आप यह जानने के लिए कैसे पंजीकरण करते हैं कि कीबोर्ड को छिपाने के लिए कुछ और चुना गया था?
एलिकएल्ज़िन-किलाका

14
मैं बेवकूफ महसूस कर रहा हूँ। मैं ICS पर कीबोर्ड को छिपाने में असमर्थ हूं। यहां सभी तरीकों की कोशिश की और उनमें से संयोजन। बिल्कुल नहीं। यह दिखाने के लिए विधि काम करती है, लेकिन मैं इसे किसी भी तरह से नहीं छिपा सकता हूं, किसी भी संत को झंडे को छिपाने, सेटिंग्स या मोमबत्तियों को प्रकट करने के लिए। कीबोर्ड शो में मैं हमेशा यह देखता हूं: I / लैटिन टाइम (396): InputType.TYPE_NULL निर्दिष्ट है W / लैटिनटाइम (396): अनपेक्षित इनपुट क्लास: इनपुट टाइप = 0x00000000 imeOptions =
0x1000000

4
/ ** * इस विधि का उपयोग सॉफ्ट कीबोर्ड को छिपाने के लिए किया जाता है। * @param activity * / public void hideSoftKeyboard (एक्टिविटी एक्टिविटी) {InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService (Activity.INPUT_ETHETHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow (activity.getCurrentFocus ()। getWindowToken (), 0); }
हर्षल बेनके

इसने मेरे लिए काम किया
nmxprime

स्क्रीन आकार और रिज़ॉल्यूशन बढ़ाने वाले उपकरणों के साथ, वर्चुअल कीबोर्ड छिपाना कम महत्वपूर्ण होता जा रहा है।
अल-कथिरी खालिद

जवाबों:


2031

इस पागलपन को स्पष्ट करने में मदद करने के लिए, मैं Google के सभी उपयोगकर्ताओं की ओर से नरम कीबोर्ड के सर्वथा हास्यास्पद उपचार के लिए माफी माँगता हूँ। कारण इतने सारे उत्तर हैं, एक ही सरल प्रश्न के लिए प्रत्येक अलग, क्योंकि यह एपीआई, एंड्रॉइड के कई अन्य लोगों की तरह, बहुत ही खराब तरीके से डिज़ाइन किया गया है। मैं इसे बताने का कोई विनम्र तरीका नहीं सोच सकता।

मैं कीबोर्ड को छिपाना चाहता हूं। मैं निम्नलिखित कथन के साथ Android प्रदान करने की उम्मीद करता हूं Keyboard.hide():। समाप्त। आपका बहुत बहुत धन्यवाद। लेकिन Android में एक समस्या है। InputMethodManagerकीबोर्ड को छिपाने के लिए आपको इसका उपयोग करना होगा । ठीक है, ठीक है, यह कीबोर्ड के लिए एंड्रॉइड का एपीआई है। परंतु! ContextIMM तक पहुँचने के लिए आपके पास एक होना आवश्यक है । अब हमें एक समस्या है। मैं कीबोर्ड को एक स्थिर या उपयोगिता वर्ग से छुपाना चाह सकता हूं जिसका कोई उपयोग या आवश्यकता नहीं है Context। या इससे भी बदतर, IMM के लिए आवश्यक है कि आप निर्दिष्ट करें View(या इससे भी बदतर, क्या Window) आप कीबोर्ड से छिपाना चाहते हैं।

यह वह है जो कीबोर्ड को इतना चुनौतीपूर्ण बनाता है। प्रिय Google: जब मैं केक की रेसिपी देख रहा हूँ, तो RecipeProviderपृथ्वी पर ऐसा कोई भी नहीं है जो मुझे रेसिपी प्रदान करने से मना कर दे, जब तक कि मैं पहले जवाब न दूं कि केक किसके द्वारा खाया जाएगा और कहाँ खाया जाएगा !!

यह दुखद कहानी बदसूरत सच्चाई के साथ समाप्त होती है: एंड्रॉइड कीबोर्ड को छिपाने के लिए, आपको पहचान के 2 रूप प्रदान करने होंगे: a Contextऔर a Viewया a Window

मैंने एक स्टैटिस्टिकल यूटिलिटी मेथड बनाया है, जो बहुत ही ठोस तरीके से काम कर सकता है, बशर्ते आप इसे एक स्टैटिक कहें Activity

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

विदित हो कि यह उपयोगिता विधि केवल तभी काम करती है जब किसी से कॉल किया जाता है Activity! उपरोक्त विधि उचित विंडो टोकन प्राप्त करने getCurrentFocusके लिए लक्ष्य की कॉल करती है Activity

लेकिन मान लीजिए कि आप किसी EditTextहोस्ट से कीबोर्ड को छिपाना चाहते हैं DialogFragment? आप इसके लिए उपरोक्त विधि का उपयोग नहीं कर सकते हैं:

hideKeyboard(getActivity()); //won't work

यह काम नहीं करेगा क्योंकि आप एक Fragmentमेजबान के लिए एक संदर्भ पारित करेंगे Activity, जिसमें Fragmentदिखाया गया है, जबकि कोई केंद्रित नियंत्रण नहीं होगा ! वाह! इसलिए, टुकड़े से कीबोर्ड को छिपाने के लिए, मैं निचले स्तर का सहारा लेता हूं, अधिक सामान्य, और बदसूरत:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

नीचे कुछ अतिरिक्त जानकारी है जो इस समाधान का पीछा करते हुए अधिक समय बर्बाद किया है:

WindowSoftInputMode के बारे में

ध्यान देने के लिए विवाद का एक और बिंदु है। डिफ़ॉल्ट रूप से, Android स्वचालित रूप EditTextसे आपके पहले या फ़ोकस करने योग्य नियंत्रण पर प्रारंभिक ध्यान केंद्रित करेगा Activity। यह स्वाभाविक रूप से निम्नानुसार है कि InputMethod (आमतौर पर सॉफ्ट कीबोर्ड) स्वयं को दिखा कर फोकस ईवेंट का जवाब देगा। windowSoftInputModeमें विशेषता AndroidManifest.xmlहै, जब करने के लिए सेट stateAlwaysHidden, कीबोर्ड इस स्वत: सौंपा प्रारंभिक ध्यान अनदेखी करने के लिए निर्देश देता है।

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

लगभग अविश्वसनीय रूप से, यह कीबोर्ड को खोलने से रोकने के लिए कुछ भी नहीं करता है जब आप नियंत्रण को छूते हैं (जब तक focusable="false"और नियंत्रण focusableInTouchMode="false"को सौंपा नहीं जाता है)। स्पष्ट रूप से, windowSoftInputMode सेटिंग केवल स्वचालित फोकस घटनाओं पर लागू होती है, स्पर्श घटनाओं द्वारा ट्रिगर की गई घटनाओं पर ध्यान केंद्रित करने के लिए नहीं।

इसलिए, stateAlwaysHiddenवास्तव में बहुत खराब नाम है। इसे शायद ignoreInitialFocusइसके बजाय कहा जाना चाहिए ।

उम्मीद है की यह मदद करेगा।


UPDATE: विंडो टोकन प्राप्त करने के और तरीके

यदि कोई केंद्रित दृश्य नहीं है (उदाहरण के लिए, यदि आप केवल टुकड़ों को बदल सकते हैं तो हो सकता है), ऐसे अन्य विचार हैं जो एक उपयोगी विंडो टोकन की आपूर्ति करेंगे।

उपरोक्त कोड के लिए ये विकल्प हैं if (view == null) view = new View(activity); ये आपकी गतिविधि को स्पष्ट रूप से संदर्भित नहीं करते हैं।

एक टुकड़ा वर्ग के अंदर:

view = getView().getRootView().getWindowToken();

fragmentएक पैरामीटर के रूप में एक टुकड़ा दिया :

view = fragment.getView().getRootView().getWindowToken();

आपके सामग्री शरीर से शुरू:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

अपडेट 2: यदि आप ऐप को बैकग्राउंड से खोलते हैं तो फिर से कीबोर्ड दिखाने से बचें

इस पंक्ति को विधि के अंत में जोड़ें:

view.clearFocus();


2
बहुत अच्छा लेखन। हालाँकि एक बात, अगर आप इसके ऊपर एक और गतिविधि शुरू करते हैं, जो कीबोर्ड को ट्रिगर करता है, कीबोर्ड तब भी मौजूद रहेगा जब आप वापस लौटेंगे। शीर्ष गतिविधि को समाप्त करते समय अपनी विधि का उपयोग करके कीबोर्ड को हटाकर तय किया।
ओविंद

3
@rmirabelle Fragmentऐसा लगता है कि आप उपयोग कर सकते हैंgetActivity().getWindow().getDecorView()
McX

1
यह पोस्ट महान है लेकिन आपके पास दो बहुत महत्वपूर्ण भाग की कमी है। प्रति संस्करण किए गए सूक्ष्म परिवर्तन और प्रति निर्माण किया जाता है। उदाहरण के लिए, सैमसंग गैलेक्सी s6 पर हमें कीबोर्ड को छिपाने से पहले .clearFocus () का उपयोग करने की आवश्यकता है ... यदि कीबोर्ड अभी भी एडिटटेक्स्ट के दूसरे क्लिक पर पॉप नहीं होगा: S
Warpzit

17
Google को वास्तव में वह Keyboard.hide();उपयोगिता प्रदान करनी चाहिए
HendraWD

1
[someView] .getContext () << गतिविधि के मामले में हो सकता है। यह हमेशा एक ही वस्तु है। (अंदर की सेवाओं को छोड़कर ...)
ओलिवर डिक्सन

4417

आप Android को अपने फ़ोकस दृश्य वाले विंडो के टोकन में कॉलिंग , इनपुटमेथोडमनगर का उपयोग करके वर्चुअल कीबोर्ड को छिपाने के लिए मजबूर कर सकते hideSoftInputFromWindowहैं।

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

यह सभी स्थितियों में कीबोर्ड को छिपाने के लिए मजबूर करेगा। कुछ मामलों में आप InputMethodManager.HIDE_IMPLICIT_ONLYदूसरे पैरामीटर के रूप में पास करना चाहते हैं ताकि आप केवल कीबोर्ड को छिपा सकें, जब उपयोगकर्ता स्पष्ट रूप से इसे प्रदर्शित करने के लिए मजबूर न करे (मेनू दबाकर)।

नोट: यदि आप कोटलिन में ऐसा करना चाहते हैं, तो उपयोग करें: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

कोटलिन सिंटेक्स

// Check if no view has focus:
 val view = this.currentFocus
 view?.let { v ->
  val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager 
  imm?.hideSoftInputFromWindow(v.windowToken, 0)
 }

14
धन्यवाद, अगर दूसरे पैरामीटर के रूप में 0 का उपयोग करते हुए यह बहुत अच्छा काम करता है। लेकिन अगर मैं InputMethodManager.HIDE_IMPLICIT_ON का उपयोग करता हूं तो कीबोर्ड कभी भी छिपा हुआ नहीं है (हालांकि मैं मेनू को दबाए नहीं रखता)। कोई संकेत?
RoflcoptrException

27
ठंडा। बस स्पष्ट करने के लिए, यह केवल इसे मौजूद होने पर खारिज कर देता है, लेकिन इसे पॉप अप करने से नहीं रोक पाएगा , है ना?
चेजमिस्टर

15
यह सॉफ्टटपुट को छिपाने से पहले editText.clearFocus () को कॉल करने में मददगार हो सकता है
user2224350

111
कॉलिंग editText.clearFocus()तब InputMethodManager.HIDE_IMPLICIT_ONLYभी काम करती है4.1
sprocket12

11
4.4 / htc पर मेरे लिए क्या काम किया गया था, View focused = getCurrentFocus()जो निश्चित रूप से वर्तमान में केंद्रित दृश्य, कॉलिंग focused.clearFocus()और फिर inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)(स्पष्ट झंडे के साथ) प्राप्त करने के लिए निष्पादित कर रहा था ।
आयनोक्लेस्ट ब्रिघम

805

सॉफ्ट-कीबोर्ड को छिपाने के लिए भी उपयोगी है:

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);

इसका उपयोग सॉफ्ट-कीबोर्ड को दबाने के लिए किया जा सकता है जब तक कि उपयोगकर्ता वास्तव में EditText व्यू को नहीं छूता है।


116
आप अपनी गतिविधि पर अपनी गतिविधि पर android: windowSoftInputMode = "StateHidden" जोड़कर समान प्रभाव प्राप्त कर सकते हैं।
BoD

7
एपीआई स्तर 9 पर एक फ्रैगमेंट (मालिक गतिविधि का उल्लेख करते हुए) में यह कोशिश की और यह दुर्भाग्य से काम नहीं किया। इसे onResume और onActivity में कॉल करने की कोशिश की - कोई प्रभाव नहीं।
AgentKnopf

2
मैं एक संवाद में काम कर रहा हूं और यह काम कर रहा है। मैं एंड्रॉइड 3.2 का उपयोग कर रहा हूं। मैंने इसे ऑनक्रिएटडियलॉग (बंडल) विधि में डाला। यह ऑनक्रिएट विधि में काम नहीं करता था। संवाद संवाद = super.onCreateDialog (saveInstanceState); Dial.getWindow ()। setSoftInputMode (WindowManager.LayoutParams। SOFT_INPUT_STATE_ALWAYS_HIDDEN); परिणाम यह है कि इसमें EditTexts के साथ मेरा दृश्य बिना कीबोर्ड के दिखाई देता है। जब उपयोगकर्ता एक संपादित पाठ को छूता है, तो कीबोर्ड दिखाता है।
फ़्लोबाका जूल

4
यह तब काम नहीं करता जब फ़ोकस एडिटटेक्स्ट में रहता है (जैसे, एक बटन को छूने के बाद)। उसके लिए रेटो के समाधान का उपयोग करें।
नौमेनन

4
प्रकट सेटिंग्स ओवरराइडिंग एक बुरा विचार क्यों है? मैं इसे खंड-खंड कह रहा हूं। कोई प्रकट सेटिंग नहीं है जो एक टुकड़े पर लागू होती है ...
ग्रेग एननिस

348

मुझे कीबोर्ड छिपाने के लिए एक और समाधान मिला:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

यहाँ HIDE_IMPLICIT_ONLYकी स्थिति पर showFlagऔर 0की स्थिति में पास hiddenFlag। यह जबरदस्ती सॉफ्ट कीबोर्ड बंद करेगा।


4
आप showflags पैरामीटर में एक छिपा हुआ ध्वज का उपयोग कर रहे हैं। यह केवल इसलिए काम करता है क्योंकि स्थिरांक एक ही पूर्णांक का उपयोग करते हैं। उदाहरणों को सही झंडे का उपयोग करते हुए
एलेक्स

एंड्रॉइड 4.0 पर परीक्षण किया गया है, मुझे यह समाधान पसंद है, क्योंकि मेरे पास कई संपादित ग्रंथ हैं, उस गतिविधि के बटन, जिस पर ध्यान केंद्रित किया जा सकता है

32
@Mark: क्योंकि विधि को "toggleSoftInput" कहा जाता है, न कि "HideSoftInput" :)
Sver

19
यह समाधान कीबोर्ड को दिखाता है यदि यह छिपा हुआ है। यह सही नहीं है
माइकल काटकोव

1
@ अकाशअगरवाल - यह "काम करता है" यदि आप इस तथ्य को अनदेखा करते हैं कि यह केवल आपके लिए काम करता है क्योंकि कीबोर्ड दिखा रहा था। (यह कीबोर्ड की दृश्यता को प्रदर्शित करता है: यह जब यह दिखा रहा है तो इसे छुपाता है, लेकिन यह इसे दिखाता है जब यह !!!) क्या आप इसे कहते हैं? यदि ऐसा है, तो आगे बढ़ो और इसका उपयोग करें!
टूलमेकरसैट

148

मेरे लिए मीयर का समाधान भी काम करता है। मेरे मामले में मेरे ऐप का शीर्ष स्तर एक टैबहॉस्ट है और मैं टैब स्विच करते समय कीवर्ड को छुपाना चाहता हूं - मुझे टैबहोस्ट व्यू से विंडो टोकन मिलता है।

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

मुझे यह SearchView के साथ भी काम करने के लिए मिला है। मेरे जवाब के लिए नीचे देखें। धन्यवाद mckoss!
अज़ुरसपोट

138

कृपया नीचे दिए गए कोड को इसमें आज़माएं onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);

2
यह विधि 2.0 और 2.1 में "सॉफ्ट कीबोर्ड को छिपा नहीं सकती" के आसपास कोड के रूप में काम करती है। जैसा कि code.google.com/p/android/issues/detail?id=7115 में वर्णित है ... HideSoftInputFromWindow विधि जब मैंने इसे आज़माया तो ऊपर सूचीबद्ध काम नहीं किया गया, लेकिन editView.setInputType (0) ने किया।
स्पाइक विलियम्स

18
यह जवादोक (हैक नहीं) के अनुसार वैध है, हालांकि मैं इस विधि को फिर से editView.setInputType(InputType.TYPE_NULL);
लिखूंगा

3
यह काम करता है, हालांकि, यह एंड्रॉइड को छुपाता है: संकेत। मैं एंड्रॉइड 1.5 का उपयोग कर रहा हूं
तीर्थ

जब आप किसी संवाद से कीबोर्ड को बंद करने की आवश्यकता होती है, तो इसके लिए बहुत अच्छा होता है, उदाहरण या कुछ भी प्राप्त करने की आवश्यकता नहीं होती है और उपयोगकर्ता द्वारा डायलॉग को बंद करने वाले बटन को दबाते समय इसे सभी संपादित पाठों को निर्दिष्ट कर सकते हैं
I_With_Stupid

यह काम करता है, लेकिन यह कर्सर को भी छिपा रहा है। मुझे कर्सर की आवश्यकता है, लेकिन कोई सिस्टम कीबोर्ड नहीं।
स्टीफन ब्रेंडल

128

अद्यतन: मुझे नहीं पता कि यह समाधान किसी भी अधिक काम नहीं कर रहा है (मैंने अभी Android 23 पर परीक्षण किया है)। कृपया इसके बजाय सौरभ पारीक के समाधान का उपयोग करें । यह रहा:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

पुराना उत्तर:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

8
मुझे यह कोड कहां रखना चाहिए? मैंने getWindow () सेट करने की कोशिश की है। setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
onCreate

काम नहीं करता है, RadioGroup.setOnCheckedChangeListener में परीक्षण किया गया है, एपीआई 23
क्रिश्चियन

यदि आप करीब से देखते हैं, तो InputMethodManager.HIDE_IMPLICIT_ONLY और InputMethodManager.SHOW_IMPLICIT का समान मूल्य है, जो "1" है, इसलिए इन कॉल के बीच कोई अंतर नहीं है। => काम नहीं कर रहा है
पैलजेंड्रो

अगर फोन कर रहा है, तो ई-मेल से संपर्क करें। (InputMethodManager.HIDE_IMPLICIT_ONLY, 0); तब कीबोर्ड स्क्रीन पर दिखाई देगा :) सर्वश्रेष्ठ कार्यान्वयन है: github.com/ravindu1024/android-keyboardlistener Android एसडीके पर शर्म
डुन

I don't know why this solution is not work any more- क्योंकि यह एंड्रॉइड है , सब कुछ बदलने में सक्षम होगा, शायद आंशिक रूप से खराब डिजाइन ... हम लापरवाह लिखते हैं, फिर हम सभी को हड़ताल करते हैं और सब कुछ फिर से लिखते हैं।
राजा राजा

88
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

5
यह मेरे लिए काम किया! लेकिन आपने input.setInputType (0) क्यों डाला ? मैं EditTextView के साथ बातचीत नहीं कर सका जब मेरे पास कोड की यह पंक्ति थी (यह काम किया जब मैंने इसे हटा दिया)।
यमरद्रेंग्ने

शायद input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
कूलमाइंड

मैंने input.setInputType(0);इस कोड को हटा दिया । इसने एक कीबोर्ड व्यवहार और के inputTypeलिए बदल दिया EditText
कूलमाइंड

73

यदि यहां अन्य सभी उत्तर आपके लिए काम नहीं करते हैं जैसा कि आप उन्हें करना चाहते हैं, तो कीबोर्ड को मैन्युअल रूप से नियंत्रित करने का एक और तरीका है।

इसके साथ एक फ़ंक्शन बनाएँ जो कुछ EditTextगुणों को प्रबंधित करेगा :

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

फिर, सुनिश्चित करें कि EditTextआप का onFocus कीबोर्ड खोलें / बंद करें:

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

अब, जब भी आप कीबोर्ड को मैन्युअल रूप से कॉल करना चाहते हैं:

setEditTextFocus(true);

और समापन कॉल के लिए:

setEditTextFocus(false);

+1 - यदि आप बंद कीबोर्ड के साथ एक गतिविधि शुरू करना चाहते हैं, तो इस समाधान का उपयोग करें और एक onclicklistener जोड़ें जो setEditTextFocus (true) सेट करता है। करिश्मा जैसा काम करता है!
स्किंगेल

मुझे code कोड के दूसरे ब्लॉक की 7 वीं और 10 वीं पंक्ति पर 'संकल्प संकल्प प्रतीक का संदर्भ नहीं मिला।
गिममेग्मे


61

सौरभ पारीक के पास अब तक का सबसे अच्छा जवाब है।

हालांकि सही झंडे का उपयोग कर सकते हैं।

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

वास्तविक उपयोग का उदाहरण

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}

1
यह नवीनतम संस्करण के लिए सबसे अधिक कुशल है। हमेशा पुराने संस्करणों के लिए इसे ट्विक करने की आवश्यकता होगी। विशेष रूप से v3 से पहले।
एलेक्स

2
@ माज़ेन: उपयोगfragment.getActivity().getSystemService();
जोहान एस

यह सबसे व्यापक जवाब है, दोनों को दिखाने और छिपाना।
एंड्रे स्टाल्टज

4
नहीं, मेरे सैमसंग टैब पर, एंड्रॉइड 5.0, ऊपर तथाकथित "छिपा कीबोर्ड" कोड नरम कीबोर्ड को स्पर्श करेगा - यदि यह पहले से ही छिपा हुआ है, तो यह दिखाएगा। इस फ़ंक्शन के नाम में TOGGLE है एक कारण है।
टूलमेकरसेव

57

इतनी खोज से, यहाँ मुझे एक जवाब मिला जो मेरे लिए काम करता है

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

केवल वही जो मेरे लिए मोटोरोला के लिए एंड्रॉइड 5.1
GMX

55

संक्षिप्त उत्तर

अपने OnClickश्रोता onEditorActionके EditTextसाथ कॉल कीIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

ड्रिल-डाउन

मुझे लगता है कि यह विधि एंड्रॉइड के डिजाइन पैटर्न के साथ बेहतर, सरल और अधिक संरेखित है। ऊपर दिए गए साधारण उदाहरण में (और आमतौर पर अधिकांश सामान्य मामलों में) आपके पास एक EditTextफोकस होगा / होगा और यह आमतौर पर पहली जगह में कीबोर्ड को इनवॉइस करने के लिए भी होता था (यह निश्चित रूप से कई में इसे लागू करने में सक्षम है। आम परिदृश्य)। उसी तरह, यह कीबोर्ड जारी करने वाला होना चाहिए, आमतौर पर यह एक द्वारा किया जा सकता है ImeAction। बस यह देखें कि व्यवहार के EditTextसाथ android:imeOptions="actionDone"आप कैसे व्यवहार करते हैं, आप उसी व्यवहार को प्राप्त करना चाहते हैं।


इस संबंधित उत्तर की जाँच करें


यह जवाब है। केवल वह विधि जो क्रॉस वर्जन पर काम करती है। मैं इस सवाल का जवाब देने के लिए वापस आया, क्योंकि मुझे नहीं लगता था कि किसी और को पता था
नूह Passalacqua

यह सही उत्तर होना चाहिए। एंड्रॉइड को कीबोर्ड में छिपाने के बजाय जब यह वास्तव में होना चाहिए, तो हम यह बताते हैं कि उपयोगकर्ता किया जाता है, जो बदले में उसी ImeAction [बेवकूफ नाम, मैं मानता हूं] के रूप में मानो उपयोगकर्ता ने कीबोर्ड पर "संपन्न" किया था। । यदि उपयोगकर्ता कीबोर्ड पर इनपुट की पुष्टि करता है या यूआई बटन को टैप करता है तो इस तरह से कोई फर्क नहीं पड़ता।
ओलिवर हॉसलर

46

यह काम करना चाहिए:

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);

आंशिक रूप से काम किया, भले ही कीबोर्ड को "हतियुक्त" () "झूठे" कहा गया हो!
xpto

बेशक यह करता है, यह माना जाता है। या हो सकता है कि मैं आपको नहीं समझता। वैसे भी, आप वर्ग के साथ पूरक कर सकते हैं hide()और show()तरीकों पर अधिक नियंत्रण रखना चाहिए कि यह कब दिखाना चाहिए और कब नहीं। मेरे लिए काम करता है, मैंने इसे भी किया :) मैं उदाहरण संपादित
करूंगा

@ YoushaAleayoub हाँ यह होगा। KeyBoard.toggle(fragment.getActivity())
slinden77

@ slinden77, योग्य, मैं आपके उत्तर के बारे में बात कर रहा हूं ... यह वह नहीं है जिस पर आपने टिप्पणी की है। तो यह जवाब अभी भी काम नहीं करेगा।
युषा अलायूब

@YoushaAleayoub उह यह होगा मूल प्रश्न टुकड़ों का उल्लेख नहीं करता है, आप वह हैं जिन्होंने टुकड़ों का उल्लेख किया है। तो मेरा जवाब पूरी तरह से मान्य है। टुकड़े के साथ इसका उपयोग करने के लिए Fragment, एक टिप्पणी की तरह, विधि से अलग तरीके से कॉल करें । कृपया तरीकों का उपयोग करना सीखें और फिर वापस आएं। आप अपने मूर्खतापूर्ण जवाबों से लोगों को भ्रमित कर रहे हैं
slinden77

43

मैं हेक्स संख्या इनपुट करने के लिए एक कस्टम कीबोर्ड का उपयोग कर रहा हूं ताकि मुझे IMM कीबोर्ड शो न हो ...

V3.2.4_r1 setSoftInputShownOnFocus(boolean show)में मौसम को नियंत्रित करने के लिए जोड़ा गया था या कीबोर्ड को प्रदर्शित नहीं करने के लिए जब एक TextView फ़ोकस हो जाता है, लेकिन इसके अभी भी छिपे हुए प्रतिबिंब का उपयोग किया जाना चाहिए:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

पुराने संस्करणों के लिए, मुझे अपने मूल दृश्य से OnGlobalLayoutListenerसहायता के साथ बहुत अच्छे परिणाम (लेकिन एकदम सही से दूर) मिल ViewTreeObserverगए, और यह जांचने के लिए कि क्या कीबोर्ड इस तरह दिखाया गया है:

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

यह अंतिम समाधान एक विभाजन दूसरे के लिए कीबोर्ड दिखा सकता है और चयन हैंडल के साथ गड़बड़ करता है।

जब कीबोर्ड पूर्ण स्क्रीन में प्रवेश करता है, तो onGlobalLayout को नहीं बुलाया जाता है। उससे बचने के लिए, TextView # setImeOptions (int) या TextView XML घोषणा में उपयोग करें:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

अपडेट: बस पाया गया कि सभी संस्करणों में कीबोर्ड और काम न करने के लिए कौन से संवाद का उपयोग किया जाता है:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

धन्यवाद। दो ध्वज FLAG_ALT_FOCUSABLE_IM और FLAG_ALT_FOCUSABLE_IM मेरे मामले में मदद करने वाली एकमात्र चीज़ है। मैं नहीं चाहता था कि मेरी गतिविधि में एक कीबोर्ड दिखाया जाए - तब भी नहीं जब उपयोगकर्ता ने एक एडिटटेक्स्ट क्लिक किया हो। (मैंने अपना "कीपैड" बनाया)।
डेनियल नोवाक

शांत समाधान, हालांकि, यदि आपकी सामने की गतिविधि फुलस्क्रीन नहीं है, तो इसके पीछे कीबोर्ड दिखाई देता है। साथ ही कीबोर्ड का कर्सर मूवमेंट सहायता अभी भी दिखाई देता है। और यह चमड़ी नहीं है।
हल

मुझे भी वह पता हैं। सभी संभावित तरीकों में से केवल getWindow ()। SetFlags () विधि काम करती है, कम से कम स्टॉक एंड्रॉइड 5.1 पर। ध्यान दें कि setSoftInputShownOnFocus () अब सेट किया गया हैShowSoftInputOnFocus () और अब छिपा नहीं है, लेकिन उपयोगकर्ता के क्षेत्र को छूने पर कम से कम ऐसा काम नहीं करता है।
olefevre

आपका "अपडेट" मेरे लिए एकमात्र कार्यशील समाधान था। मैं कम से कम दो घंटे के समाधान की तलाश में हूं :)
स्टीफन ब्रेंडल

33
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}

30

मैंने थ्रेड में पोस्ट किए गए सभी समाधानों के माध्यम से काम करते हुए दो दिन से अधिक समय बिताया है और पाया है कि उन्हें एक या दूसरे तरीके से कमी है। मेरी सटीक आवश्यकता एक बटन है जो 100% विश्वसनीयता दिखाने या स्क्रीन कीबोर्ड को छिपाने के लिए है। जब कीबोर्ड अपनी छिपी अवस्था में हो तो उसे फिर से नहीं दिखाना चाहिए, इससे कोई फर्क नहीं पड़ता कि उपयोगकर्ता किस इनपुट पर क्लिक करता है। जब यह अपने दृश्यमान अवस्था में होता है, तो कीबोर्ड को किसी भी तरह से गायब नहीं होना चाहिए जो उपयोगकर्ता क्लिक करता है। इसके लिए Android 2.2+ पर नवीनतम उपकरणों पर काम करने की आवश्यकता है।

आप मेरे ऐप क्लीन आरपीएन में इसे लागू करने का कार्य देख सकते हैं ।

कई अलग-अलग फोन (froyo और जिंजरब्रेड डिवाइस सहित) पर कई सुझाए गए उत्तरों का परीक्षण करने के बाद यह स्पष्ट हो गया कि एंड्रॉइड ऐप्स मज़बूती से कर सकते हैं:

  1. अस्थायी रूप से कीबोर्ड छिपाएं। जब उपयोगकर्ता किसी नए पाठ क्षेत्र पर ध्यान केंद्रित करता है तो यह फिर से प्रकट होगा।
  2. जब कोई गतिविधि शुरू होती है तो कीबोर्ड दिखाएं और गतिविधि पर एक ध्वज सेट करें जो यह दर्शाता है कि उन्हें हमेशा दिखाई देना चाहिए। यह ध्वज केवल तब सेट किया जा सकता है जब कोई गतिविधि आरंभ कर रही हो।
  3. कीबोर्ड के उपयोग को कभी भी दिखाने या अनुमति देने के लिए किसी गतिविधि को चिह्नित करें। यह ध्वज केवल तब सेट किया जा सकता है जब कोई गतिविधि आरंभ कर रही हो।

मेरे लिए, अस्थायी रूप से कीबोर्ड छिपाना पर्याप्त नहीं है। कुछ उपकरणों पर यह एक नया पाठ क्षेत्र केंद्रित होते ही फिर से दिखाई देगा। जैसा कि मेरा ऐप एक पृष्ठ पर कई टेक्स्ट फ़ील्ड का उपयोग करता है, नए टेक्स्ट फ़ील्ड पर ध्यान केंद्रित करने से छिपे हुए कीबोर्ड फिर से पॉप अप हो जाएंगे।

दुर्भाग्य से सूची में आइटम 2 और 3 केवल कार्य विश्वसनीयता है जब एक गतिविधि शुरू की जा रही है। एक बार गतिविधि दिखाई देने के बाद आप कीबोर्ड को स्थायी रूप से छिपा या दिखा नहीं सकते। जब उपयोगकर्ता कीबोर्ड टॉगल बटन दबाता है तो चाल वास्तव में आपकी गतिविधि को पुनरारंभ करना है। मेरे ऐप में जब उपयोगकर्ता टॉगल कीबोर्ड बटन दबाता है, तो निम्न कोड चलता है:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

यह वर्तमान गतिविधि का कारण बनता है कि उसका राज्य एक बंडल में सहेजा गया है, और फिर गतिविधि शुरू हो जाती है, एक बूलियन से गुजरती है जो इंगित करती है कि कीबोर्ड दिखाया जाना चाहिए या छिपाया जाना चाहिए।

ऑनक्रीट विधि के अंदर निम्नलिखित कोड चलाया जाता है:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

यदि सॉफ्ट कीबोर्ड को दिखाया जाना चाहिए, तो InputMethodManager को कीबोर्ड दिखाने के लिए कहा जाता है और विंडो को सॉफ्ट इनपुट को हमेशा दृश्यमान बनाने के निर्देश दिए जाते हैं। यदि नरम कीबोर्ड छिपा होना चाहिए तो WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM सेट हो जाता है।

यह दृष्टिकोण उन सभी उपकरणों पर मज़बूती से काम करता है, जिन पर मैंने परीक्षण किया है - एक 4 साल पुराने एचटीसी फोन से एंड्रॉइड 2.2 तक एक नेक्सस 7 तक 4.2.2 चल रहा है। इस दृष्टिकोण के साथ एकमात्र नुकसान आपको बैक बटन को संभालने के साथ सावधान रहने की आवश्यकता है। जैसा कि मेरे ऐप में अनिवार्य रूप से केवल एक स्क्रीन है (इसकी कैलकुलेटर) मैं onBackPressed () को ओवरराइड कर सकता हूं और उपकरणों को होम स्क्रीन पर वापस कर सकता हूं।


1
विस्तृत समाधान, लेकिन मुझे लगता है कि यह बहुत अधिक है, बस कीबोर्ड को छिपाने के लिए हजारों वस्तुओं को फिर से बनाना। मुझे नहीं पता कि Android के लिए IMM को किसने डिज़ाइन किया था, लेकिन इसमें Windows APi की तरह खुशबू आ रही है। मेरी राय में, एक अच्छे IME के ​​दो तरीके होने चाहिए: छुपाना और दिखाना :-)
13:13

यह सब सच है, लेकिन मेरे काम करने का एक फायदा है - यह हमेशा काम करता है! ऐसा कोई दूसरा उपाय नहीं है जो मुझे पता चल सके कि हमेशा कीबोर्ड टॉगल होगा, चाहे यूआई में किन क्षेत्रों पर ध्यान दिया जाए, उपयोगकर्ता ने टॉगल और कीबोर्ड के लिए क्या किया है और वे किस संस्करण को चला रहे हैं: - \
ल्यूक स्लीमैन

यार, मैं कीबोर्ड को छिपाने के लिए पूरी तरह से बेताब हूं। हजारों चीजों की कोशिश की और दोपहर का काम किया। लेकिन मेरे लिए आपका वर्कअराउंड बहुत ज्यादा है, मुझे 10 टुकड़ों को फिर से बनाना होगा, सेवाओं को इनिशियलाइज़ करना होगा, बहुत सारे वेकेशन को डिलीट करना होगा .... आप जानते हैं? जीसी सिर्फ 25 एमबी की तरह फेंक होगा: एस ... फिर भी यह करने के लिए :( एक विश्वसनीय तरीका की तलाश में
rupps

@ अच्छी तरह से याद रखें यह एक नमस्ते दुनिया नहीं है ... यह गोलियों के लिए एक जटिल अनुप्रयोग है। मैं इसे केवल एक मूर्ख कीबोर्ड को छिपाने के लिए मेमोरी से पूरी तरह से अनलोड करने से इनकार करता हूं ... वैसे भी मुझे कुछ ऐसा मिला जो यहां प्रस्तावित हजार समाधानों के संयोजन का काम करता है :)
बर्बाद कर देता है

27

वैकल्पिक रूप से इस समाधान के चारों ओर , अगर आप उस कीबोर्ड को खोलने के लिए उपयोग किए जाने वाले (EditText) फ़ील्ड का संदर्भ लिए बिना कहीं से सॉफ्ट कीबोर्ड को बंद करना चाहते थे , लेकिन फिर भी यह करना चाहते थे यदि फ़ील्ड केंद्रित थी, तो आप उपयोग कर सकते हैं यह (एक गतिविधि से):

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

25

इस एसओ उत्तर के लिए धन्यवाद , मैंने निम्नलिखित प्राप्त किया है, जो मेरे मामले में, एक ViewPore के टुकड़े के माध्यम से स्क्रॉल करते समय अच्छी तरह से काम करता है ...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}

21

उपरोक्त उत्तर अलग-अलग परिदृश्य के लिए काम करते हैं लेकिन यदि आप एक दृश्य के अंदर कीबोर्ड को छिपाना चाहते हैं और सही संदर्भ प्राप्त करने के लिए संघर्ष कर रहे हैं, तो यह कोशिश करें:

setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyBoardOnTabClicked(v);
    }
}

private void hideSoftKeyBoardOnTabClicked(View v) {
    if (v != null && context != null) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

और संदर्भ प्राप्त करने के लिए इसे निर्माता से प्राप्त करें :)

public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}

18

यदि आप एक इकाई या कार्यात्मक परीक्षण के दौरान सॉफ्ट कीबोर्ड को बंद करना चाहते हैं, तो आप अपने परीक्षण से "बैक बटन" पर क्लिक करके ऐसा कर सकते हैं:

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

मैंने उद्धरण में "बैक बटन" डाला है, क्योंकि उपरोक्त onBackPressed()गतिविधि में गतिविधि के लिए ट्रिगर नहीं करता है । यह सिर्फ कीबोर्ड को बंद करता है।

आगे बढ़ने से पहले थोड़ी देर के लिए रुकना सुनिश्चित करें, क्योंकि बैक बटन को बंद करने में थोड़ा समय लगता है, इसलिए बाद में व्यूज़ आदि पर क्लिकों को तब तक पंजीकृत नहीं किया जाएगा, जब तक कि एक छोटे से ठहराव के बाद (1 सेकंड का समय काफी लंबा न हो जाए )।


16

यहाँ आप इसे एंड्रॉइड के लिए मोनो में कैसे करें (AKA MonoDroid)

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);

1
searchboxस्निपेट में क्या है ?
पीसीओडर

16

यह मेरे लिए सभी विचित्र कीबोर्ड व्यवहार के लिए काम करता है

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

1
लगता है कि मैं इस से पहले 10 जवाब की कोशिश की। उम्मीद छोड़ दी थी। धन्यवाद दोस्त।
बोलिंग

MRootView क्या है?
justdan0227

14

android:windowSoftInputMode="stateHidden"मेनिफेस्ट फ़ाइल में अपनी गतिविधि में जोड़ें । उदाहरण:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>

14

सरल और आसान विधि का उपयोग करने के लिए, बस HideKeyboardFrom (YourActivity.this) को कॉल करें ; कीबोर्ड को छिपाने के लिए

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

13

बस अपनी गतिविधि में इस अनुकूलित कोड का उपयोग करें:

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

ठीक काम करता है। धन्यवाद
अलिफ़

12
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

उसके बाद onTouchListener पर कॉल करें:

findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Utils.hideSoftKeyboard(activity);
        return false;
    }
});

इसे भी आज़माएँ - इसने मेरे लिए काम किया: InputMethodManager imm = ((InputMethodManager) getSystemService (गतिविधि.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow (getWindow ()। getCurrentFocus ()। getWindowToken (), 0);
ज़मसर


12

मेरे मामले के लिए, मैं एक्शनबार में एक SearchView का उपयोग कर रहा था। उपयोगकर्ता द्वारा खोज करने के बाद, कीबोर्ड फिर से खुल जाएगा।

InputMethodManager का उपयोग करने से कीबोर्ड बंद नहीं हुआ। मुझे फ़ोकस को साफ़ करना था और खोज दृश्य के फ़ोकस को झूठे पर सेट करना था:

mSearchView.clearFocus();
mSearchView.setFocusable(false);

1
बहुत चालाक। यदि उपयोगकर्ता दूसरी खोज चाहता है, तो बस फिर से खोज पर क्लिक करें।
एलेक्स

SearchView clearFocus()में Android API पृष्ठ नहीं हैं, इसलिए यह मेरे लिए काम नहीं करता था, लेकिन एक अन्य समाधान ने किया (नीचे मेरा उत्तर देखें)।
अज़ुरसपोट


12

मेरे पास मामला है, जहां मेरा EditTextभी एक में स्थित हो सकता है AlertDialog, इसलिए कीबोर्ड को खारिज करने पर बंद किया जाना चाहिए। निम्नलिखित कोड कहीं भी काम करता है:

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}

1
यह समाधान बेहतर है क्योंकि आपको यह नियंत्रित नहीं करना है कि EditText एक पैरामीटर के रूप में HideSoftInputFromWindow () विधि को कैसे पार करता है। यह बहुत अच्छा काम करता है !!
बिलजोकर

12

मैंने इन सभी उत्तरों की लगभग कोशिश की है, मेरे पास कुछ यादृच्छिक मुद्दे थे विशेष रूप से सैमसंग गैलेक्सी एस 5 के साथ।

जो मैं समाप्त करता हूं वह शो को छिपाने और छिपाने के लिए मजबूर करता है, और यह पूरी तरह से काम करता है:

/**
 * Force show softKeyboard.
 */
public static void forceShow(@NonNull Context context) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.