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




15 Answers

आप एंड्रॉइड को hideSoftInputFromWindow कीबोर्ड को छिपाने के लिए वर्चुअल कीबोर्ड को छिपाने के लिए मजबूर कर सकते हैं, जो आपके केंद्रित दृश्य वाले विंडो के टोकन में गुजरने वाले 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 में ऐसा करना चाहते हैं, तो इसका उपयोग करें: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

android android-layout android-softkeyboard android-input-method soft-keyboard

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

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




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

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

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




कोड पर नीचे दिए गए कोड को आजमाएं onCreate()

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



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



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

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

/* 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 ... */
}



संक्षिप्त जवाब

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

button.setOnClickListener(new OnClickListener() {

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

ड्रिल-डाउन

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

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




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

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

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

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

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

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

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

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



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

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

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

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

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

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




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

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



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

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

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

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




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

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



इसे इस्तेमाल करो

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



मैंने लगभग इन सभी उत्तरों की कोशिश की है, मेरे पास कुछ यादृच्छिक मुद्दे थे, खासकर सैमसंग गैलेक्सी एस 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);
}



सरल और उपयोग करने में आसान तरीका, बस 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);
}



मेरे पास मामला है, जहां मेरा 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 );
}



Related