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


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

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


3093


मूल


क्या होगा यदि आपके पास केवल एक संपादन टेक्स्ट और कई बटन हैं, जैसे चेक बॉक्स और रेडियो? कीबोर्ड की आवश्यकता होने वाली एकमात्र जगह एकल संपादन टेक्स्ट में है। कीबोर्ड को छिपाने के लिए आप कुछ और कैसे चुने गए / क्लिक किए गए यह जानने के लिए पंजीकरण कैसे करते हैं? - AlikElzin-kilaka
मैं बेवकूफ महसूस कर रहा हूँ। मैं आईसीएस पर कीबोर्ड छिपाने में असमर्थ हूं। यहां सभी विधियों और उनके संयोजनों का प्रयास किया। बिल्कुल नहीं। यह दिखाने के लिए विधि काम करता है, लेकिन मैं इसे छुपा नहीं सकता इससे कोई फर्क नहीं पड़ता कि क्या हवाओं के किनारे टोकन, झंडे, प्रकट सेटिंग्स या किसी भी संत को मोमबत्तियां छिपाएं। कीबोर्ड शो पर मैं हमेशा यह देखता हूं: I / LatinIME (3 9 6): इनपुट टाइप .YPE_NULL निर्दिष्ट है W / LatinIME (396): अप्रत्याशित इनपुट क्लास: इनपुट टाइप = 0x00000000 imeOptions = 0x00000000 - rupps
/ ** * इस विधि का उपयोग सॉफ्ट कीबोर्ड को छिपाने के लिए किया जाता है। * @param गतिविधि * / सार्वजनिक शून्य छुपाएं सॉफ्टफ़ीबोर्ड (गतिविधि गतिविधि) {इनपुट मोड मैनेजर इनपुट MethodManager = (इनपुट मोड मैनेजर) गतिविधि .getSystemService (Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow (गतिविधि .getCurrentFocus ()। getWindowToken (), 0); } - Harshal Benake
यह बहुत दुखद है कि ऐसा प्रतीत होता है कि यह सरल सवाल इतना लोकप्रिय है। - lang2
हाँ, ठीक है, एंड्रॉइड की तरह सरल सामग्री के लिए एक और दो-लाइनर समाधान हैं। - milosmns


जवाब:


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

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

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

यह दुखद कहानी बदसूरत सच्चाई के साथ समाप्त होती है: एंड्रॉइड कीबोर्ड को छिपाने के लिए, आपको पहचान के 2 रूप प्रदान करना होगा: ए Context और या तो ए View या ए 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 के बारे में

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

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

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

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

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


अद्यतन: खिड़की टोकन पाने के अधिक तरीके

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

ये उपरोक्त कोड के लिए विकल्प हैं 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();


1024



मुझे नहीं लगता कि आपको softInputMode को संशोधित करना चाहिए। यह AndroidManifest सेटिंग्स को ओवरराइड करेगा। - Kyle Ivey
पूरी तरह से जवाब के लिए बहुत बहुत धन्यवाद। मुलायम कीबोर्ड की अच्छी समझ के साथ आने वाले शुरुआती के लिए पर्याप्त मात्रा में। मैं टुकड़े से कीबोर्ड छुपाना / दिखाना चाहता था और यह मुझे मिला सबसे उचित जवाब था। - Tina
अच्छा और उपयोगी जवाब। यह StackOverflow पर उन अत्यंत दुर्लभ पोस्टों में से एक था जो पढ़ने के लिए एक खुशी है। - Rameez Hussain
@AlexanderFarber हाँ, आम तौर पर एक EditText, लेकिन मुझे लगता है कि कोई भी दृश्यमान View काम करेगा (उदा। TextView), के बाद से View केवल एक खिड़की टोकन (कीबोर्ड से छिपाने की बात) प्राप्त करने के लिए प्रयोग किया जाता है। इसके अलावा, मुझे विश्वास है View मेजबान से आना चाहिए Activity इसके बजाय Fragment - rmirabelle
@rmirabelle ए में Fragment ऐसा लगता है कि आप इसका उपयोग कर सकते हैं getActivity().getWindow().getDecorView() - McX


आप एंड्रॉइड को वर्चुअल कीबोर्ड को छिपाने के लिए मजबूर कर सकते हैं InputMethodManagerकॉलिंग 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


4176



धन्यवाद अगर यह दूसरे पैरामीटर के रूप में 0 का उपयोग कर महान काम करता है। लेकिन अगर मैं InputMethodManager का उपयोग करता हूं। HIDE_IMPLICIT_ONLY कीबोर्ड कभी छुपा नहीं जाता है (हालांकि मैं मेनू को दबा नहीं रहा हूं)। कोई संकेत? - RoflcoptrException
ठंडा। बस स्पष्ट करने के लिए, अगर यह मौजूद है तो यह केवल इसे खारिज कर देता है, लेकिन नहीं रोकना यह पॉपिंग से, सही है? - Cheezmeister
SoftInput छिपाने से पहले यह EditText.clearFocus () को कॉल करने में मददगार हो सकता है - user2224350
कॉलिंग editText.clearFocus() फिर InputMethodManager.HIDE_IMPLICIT_ONLY यहां तक ​​कि काम करता है 4.1 - sprocket12
4.4 / एचटीसी पर मेरे लिए क्या काम किया गया था View focused = getCurrentFocus() क्या है पाने के लिए निश्चित रूप से वर्तमान में केंद्रित दृश्य, कॉलिंग focused.clearFocus(), और फिर inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0) (स्पष्ट झंडे के साथ)। - Ionoclast Brigham


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

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

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


742



आप एंड्रॉइड को जोड़कर भी वही प्रभाव प्राप्त कर सकते हैं: windowSoftInputMode = "stateHidden" मेनिफेस्ट में आपकी गतिविधि पर। - BoD
इसे एपीआई लेवल 9 पर एक फ्रैगमेंट (स्वामित्व गतिविधि का संदर्भ देना) में कोशिश की और दुर्भाग्य से यह काम नहीं किया। इसे रेज़्यूम और एक्टिविटी पर कॉल करने का प्रयास किया - कोई प्रभाव नहीं। - AgentKnopf
मैं एक संवाद में काम कर रहा हूं और यह काम करता है। मैं एंड्रॉइड 3.2 का उपयोग कर रहा हूँ। मैंने इसे ऑनक्रेटडियलोग (बंडल) विधि में रखा है। यह ऑन्रेट विधि में काम नहीं करता था। संवाद संवाद = super.onCreateDialog (savedInstanceState); dialog.getWindow ()। setSoftInputMode (WindowManager.LayoutParams। SOFT_INPUT_STATE_ALWAYS_HIDDEN); नतीजा यह है कि इसमें संपादन टेक्स्ट के साथ मेरा दृश्य कीबोर्ड के बिना दिखाई देता है। जब उपयोगकर्ता एक संपादन पाठ को छूता है, तो कीबोर्ड दिखाई देता है। - flobacca
यह तब काम नहीं करता जब फोकस अभी भी एडिटटेक्स्ट में है (जैसे, बटन को छूने के बाद)। इसके लिए रेटो के समाधान का प्रयोग करें। - Noumenon
मैनिफेस्ट सेटिंग्स को ओवरराइड करना क्यों बुरा विचार है? मैं इसे एक टुकड़े से बुला रहा हूँ। कोई अभिव्यक्ति सेटिंग नहीं है जो एक टुकड़े पर लागू होती है ... - Greg Ennis


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

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

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


294



आप शोफ्लैग पैरामीटर में एक छुपा झंडा का उपयोग कर रहे हैं। यह केवल काम करता है क्योंकि स्थिरांक एक ही पूर्णांक का उपयोग करते हैं। सही झंडे का उपयोग उदाहरण - Alex
एंड्रॉइड 4.0 पर परीक्षण किया गया, मुझे यह समाधान पसंद है, क्योंकि मेरे पास एकाधिक संपादन ग्रंथ हैं, उस गतिविधि पर बटन, जो फोकस कर सकते हैं
अगर यह छिपा हुआ था तो यह कुंजीपटल क्यों दिखाता है? :)
@ मार्क: क्योंकि विधि को "toggleSoftInput" कहा जाता है, न कि "hideSoftInput" :) - Sver
यह समाधान कुंजीपटल दिखाता है अगर यह छुपा हुआ है। यह सही नहीं है - Michael Katkov


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

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

128



मुझे यह खोजव्यू के साथ भी काम करने के लिए मिला। मेरे उत्तर के लिए नीचे देखें। धन्यवाद मैकॉस! - Azurespot


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

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

115



यह विधि 2.0 और 2.1 में वर्णित "सॉफ्ट कीबोर्ड को छिपा नहीं सकती" बग के आसपास होने के साधन के रूप में काम करती है code.google.com/p/android/issues/detail?id=7115 ... ऊपर सूचीबद्ध hideSoftInputFromWindow विधि जब मैंने कोशिश की तो काम नहीं किया, लेकिन संपादित करें View.setInputType (0) किया। - Spike Williams
यह प्रति जवाडोक (हैक नहीं) वैध है हालांकि मैं इस विधि को फिर से लिखूंगा editView.setInputType(InputType.TYPE_NULL); - Bostone
यह काम करता है, हालांकि, यह एंड्रॉइड छुपाता है: संकेत। मैं एंड्रॉइड 1.5 का उपयोग कर रहा हूँ - Tirtha
@ बोस्टन यह SearchView के लिए काम नहीं कर रहा है - nmxprime
जब आप किसी संवाद से कीबोर्ड को बंद करने की आवश्यकता होती है, तो यह बहुत अच्छा होता है, उदाहरण या कुछ भी प्राप्त करने की आवश्यकता नहीं होती है और जब यह संवाद बंद करने वाले बटन को दबाता है तो यह सभी संपादन ग्रंथों को असाइन कर सकता है - I'm_With_Stupid


अद्यतन करें: मुझे नहीं पता कि यह समाधान अब और क्यों काम नहीं कर रहा है (मैंने अभी एंड्रॉइड 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);

108



मुझे यह कोड कहां रखना चाहिए? मैंने getWindow () सेट करने की कोशिश की है। SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); ऑनक्रेट () में लेकिन कीबोर्ड कभी छिपा नहीं है - user2236096
काम नहीं करता है, रेडियो समूह में परीक्षण किया जाता है .setOncheckedChangeListener, एपीआई 23 - Christian Schäfer
यदि आप नज़दीक देखते हैं, तो InputMethodManager.HIDE_IMPLICIT_ONLY और इनपुट MethodManager.SHOW_IMPLICIT का वही मान है, जो "1" है, इसलिए इन कॉल के बीच कोई अंतर नहीं है। => काम नहीं कर रहा है - Palejandro
अगर imm.toggleSoftInput को कॉल करना (इनपुट MethodManager.HIDE_IMPLICIT_ONLY, 0); फिर कीबोर्ड स्क्रीन पर दिखाएगा :) सर्वश्रेष्ठ कार्यान्वयन है: github.com/ravindu1024/android-keyboardlistener एंड्रॉइड एसडीके पर शर्म आती है - Duna
I don't know why this solution is not work any more - क्योंकि यह है एंड्रॉयड, सबकुछ बदल सकता है, शायद आंशिक रूप से खराब डिजाइन ... हम लापरवाही से लिखते हैं, फिर हम सब कुछ हड़ताल करते हैं और सबकुछ फिर से लिखते हैं। - King King