Android खारिज कीबोर्ड


147

जब एक बटन दबाया जाता है तो मैं कीबोर्ड को कैसे खारिज कर सकता हूं?


एक EditText ध्यान केंद्रित करें = गलत काम करता है। क्या आप इसे पूरी तरह से अक्षम करना चाहते हैं?
st0le

जवाबों:


325

आप वर्चुअल कीबोर्ड को अक्षम या खारिज करना चाहते हैं?

अगर आप इसे खारिज करना चाहते हैं तो आप अपने ईवेंट के क्लिक इवेंट में कोड की निम्न पंक्तियों का उपयोग कर सकते हैं

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

1
इसके साथ दो समस्याएं .... एक यह है कि myEditText को फाइनल होना चाहिए। दूसरा यह है कि मुझे यह जानना होगा कि एडिट टेक्स्ट किस फोकस पर है। इसका कोई हल?
एथन एलन

78
किसी और के लिए जो यहाँ ठोकर खाता है, आप पहली बार आने वाली गतिविधियों के लिए गतिविधि का उपयोग कर सकते हैं (या तो गतिविधि आप या टुकड़े में हैं getActivity()) । इसके अलावा, इसे करें और न कि यदि आप गतिविधियों को बदलते समय इसे दूर जाने की कोशिश कर रहे हैं। getCurrentFocus().getWindowToken()hideSoftInputFromWindow()onPause()onStop()
ड्रेक क्लेरिस

2
यह उत्तर, यहाँ टिप्पणी के साथ संयुक्त, पूरी तरह से मेरी समस्या का समाधान!
अवेशचिनी

9
कीबोर्ड को खारिज करने के लिए एक बदसूरत, बदसूरत दृष्टिकोण क्या है। मुझे आशा है कि भविष्य में इस तरह के एक सरल काम करने के लिए एक क्लीनर तरीका है।
सुबबी

73

उपरोक्त समाधान सभी डिवाइस के लिए काम नहीं करता है और इसके अलावा यह एक पैरामीटर के रूप में EditText का उपयोग कर रहा है। यह मेरा समाधान है, बस इस सरल विधि को बुलाओ:

private void hideSoftKeyBoard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

    if(imm.isAcceptingText()) { // verify if the soft keyboard is open                      
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

3
isAcceptingText()इस उत्तर को दूसरों से बेहतर बनाया
user1506104

अच्छा समाधान ... दुर्लभ मामलों में isAceptingText () झूठा वापस आ सकता है जब कीबोर्ड अभी भी स्क्रीन पर है, उदाहरण के लिए EditText से पाठ पर क्लिक करें जिसे चुना जा सकता है लेकिन उसी विंडो में संपादित नहीं किया जा सकता है।
जॉर्जी

29

यह मेरा समाधान है

public static void hideKeyboard(Activity activity) {
    View v = activity.getWindow().getCurrentFocus();
    if (v != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
}

यदि आप उस दृश्य को जानते हैं जिसके कारण कीबोर्ड दिखा है।
RPM

16

आप बटन क्लिक घटना पर भी इस कोड का उपयोग कर सकते हैं

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

13

यहाँ एक कोटलिन समाधान (धागे में विभिन्न उत्तरों को मिलाते हुए)

एक एक्सटेंशन फ़ंक्शन बनाएं (शायद एक सामान्य ViewHelpers वर्ग में)

fun Activity.dismissKeyboard() {
    val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
    if( inputMethodManager.isAcceptingText )
        inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}

तो बस का उपयोग कर उपभोग:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()

5

InputMethodManager के साथ पहला समाधान मेरे लिए एक विजेता की तरह काम करता है, getWindow ()। SetSoftInputMode पद्धति Android 4.0.3 HTC Amaze पर नहीं थी।

@ ईथन एलन, मुझे संपादित पाठ को अंतिम बनाने की आवश्यकता नहीं थी। हो सकता है कि आप एक EditText इनर क्लास का उपयोग कर रहे हों जिसे आपने युक्त विधि घोषित किया था? आप EditText को गतिविधि का एक वर्ग चर बना सकते हैं। या सिर्फ आंतरिक वर्ग / विधि के अंदर एक नया EditText घोषित करें और फिर से findViewById () का उपयोग करें। इसके अलावा, मुझे नहीं पता था कि मुझे यह जानने की जरूरत है कि फॉर्म में EditText का फोकस क्या था। मैं बस एक मनमाना चुन सकता था और इसका उपयोग कर सकता था। इस तरह:

    EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

3
ढेर अतिप्रवाह में आपका स्वागत है! यह वास्तव में एक टिप्पणी है, एक जवाब नहीं है। थोड़ा और प्रतिनिधि के साथ, आप टिप्पणी पोस्ट करने में सक्षम होंगे
जैक

4
    public static void hideSoftInput(Activity activity) {
    try {
        if (activity == null || activity.isFinishing()) return;
        Window window = activity.getWindow();
        if (window == null) return;
        View view = window.getCurrentFocus();
        //give decorView a chance
        if (view == null) view = window.getDecorView();
        if (view == null) return;

        InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null || !imm.isActive()) return;
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

1

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


fun Context.dismissKeyboard() {
    val imm by lazy { this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
    val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
    val height = windowHeightMethod.invoke(imm) as Int
    if (height > 0) {
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
    }
}


0

दृश्य के संदर्भ का उपयोग करके, हम कोटलिन में निम्नलिखित विस्तार विधियों के साथ वांछित परिणाम प्राप्त कर सकते हैं:

/**
 * Get the [InputMethodManager] using some [Context].
 */
fun Context.getInputMethodManager(): InputMethodManager {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return getSystemService(InputMethodManager::class.java)
    }

    return getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}

/**
 * Dismiss soft input (keyboard) from the window using a [View] context.
 */
fun View.dismissKeyboard() = context
        .getInputMethodManager()
        .hideSoftInputFromWindow(
                windowToken
                , 0
        )

एक बार जब ये जगह पर हों, तो कॉल करें:

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