سؤال

انا لدي EditText و Button في تخطيطي.

بعد الكتابة في حقل التحرير والنقر على Button, أريد إخفاء لوحة المفاتيح الافتراضية. أفترض أن هذا جزء بسيط من التعليمات البرمجية، ولكن من أين يمكنني العثور على مثال عليه؟

هل كانت مفيدة؟

المحلول

للمساعدة في توضيح هذا الجنون، أود أن أبدأ بالاعتذار نيابة عن جميع مستخدمي Android لعلاج Google الصريح السخري للوحة المفاتيح Soft. السبب هناك الكثير من الإجابات، وكلها مختلفة، لنفس السؤال البسيط لأن هذا API، مثل العديد من الآخرين في أندرويد، مصممة بشكل فظيع. أستطيع أن أفكر في عدم وجود طريقة مهذبة لنذكرها.

أريد إخفاء لوحة المفاتيح. أتوقع تقديم Android بالبيان التالي: Keyboard.hide(). وبعد النهاية. شكرا جزيلا. لكن أندرويد لديه مشكلة. يجب عليك استخدام InputMethodManager لإخفاء لوحة المفاتيح. حسنا، حسنا، هذا هو API أندرويد إلى لوحة المفاتيح. لكن! يجب عليك الحصول على Context من أجل الوصول إلى IMM. الآن لدينا مشكلة. قد أرغب في إخفاء لوحة المفاتيح من فئة ثابتة أو فائدة لا تستخدم أو تحتاج إلى أي Context. وبعد أو أسوأ بكثير، لا يتطلب IMM أنك تحدد ما View (أو حتى أسوأ، ماذا Window) تريد إخفاء لوحة المفاتيح من.

هذا هو ما يجعل تخفي لوحة المفاتيح صعبة للغاية. عزيزي Google: عندما أبحث عن الوصفة لكعكة، لا يوجد RecipeProvider على الأرض من شأنها أن ترفض أن تقدم لي مع الوصفة ما لم أجب أولا على من سيأكل الكعكة وأين سيأكل !!

تنتهي هذه القصة الحزينة بالحقيقة القبيحة: لإخفاء لوحة مفاتيح Android، سيطلب منك تقديم نموذجين لتحديد الهوية: 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.

هناك نقطة أخرى من الادعاء لتكون على علم. بشكل افتراضي، سيقوم Android تلقائيا بتعيين التركيز الأولي إلى الأول EditText أو السيطرة التي لا يمكن تركها في الخاص بك Activity. وبعد يتبع ذلك بشكل طبيعي أن InputMethod (عادة لوحة المفاتيح الناعمة) سيستجيب لحدث التركيز من خلال إظهار نفسها. ال windowSoftInputMode السمة في AndroidManifest.xml, ، عند ضبطها stateAlwaysHidden, ، يرشد لوحة المفاتيح لتجاهل هذا التركيز الأولي الموضح تلقائيا.

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

بشكل لا يصدق تقريبا، يبدو أنه لا يفعل شيئا لمنع فتح لوحة المفاتيح عند لمس عنصر التحكم (ما لم focusable="false" و / أو focusableInTouchMode="false" يتم تعيينها للسيطرة). على ما يبدو، ينطبق إعداد WindowsoftPutMode فقط على أحداث التركيز التلقائي، وليس التركيز الأحداث الناجمة عن أحداث اللمس.

لذلك، 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();

نصائح أخرى

يمكنك إجبار Android على إخفاء لوحة المفاتيح الافتراضية باستخدام 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 نظرا لأن المعلمة الثانية للتأكد من أنك تخفي لوحة المفاتيح فقط عندما لا يقوم المستخدم بإجباره بشكل صريح على الظهور (عن طريق الضغط باستمرار).

ملحوظة: إذا كنت ترغب في القيام بذلك في Kotlin، فاستخدم:context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

بناء جملة Kotlin

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

مفيد أيضا لإخفاء لوحة المفاتيح الناعمة هي:

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

يمكن استخدام هذا لقمع لوحة المفاتيح اللينة حتى يقوم المستخدم في الواقع بمسح عرض EDITTEXT.

حصلت على حل آخر لإخفاء لوحة المفاتيح:

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

هنا تمر HIDE_IMPLICIT_ONLY في موقف showFlag و 0 في موقف hiddenFlag. وبعد سوف تغلق بقوة لوحة المفاتيح لينة.

حل مير يعمل بالنسبة لي أيضا. في حالتي، فإن المستوى العلوي من التطبيق الخاص بي هو Tabhost وأريد إخفاء الكلمة الرئيسية عند تبديل علامات التبويب - أحصل على رمز النافذة من عرض Tabhost.

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

يرجى تجربة هذا الرمز أدناه onCreate()

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

تحديث:لا أعرف لماذا لا يعمل هذا الحل الآن (أنا فقط تم اختباره على Android 23). يرجى استخدام محلول saurabh pareek. في حين أن. ها هو:

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);
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

إذا لم تعمل جميع الإجابات الأخرى هنا من أجلك كما تريد، فهناك طريقة أخرى للتحكم يدويا في لوحة المفاتيح.

إنشاء وظيفة مع ذلك سوف تدير بعض من EditTextخصائص:

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

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

ثم، تأكد من أن onfocus من EditText يمكنك فتح / إغلاق لوحة المفاتيح:

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

saurabh pareek. لديه أفضل إجابة حتى الآن.

قد تستخدم أيضا الأعلام الصحيحة، رغم ذلك.

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

من البحث، هنا وجدت إجابة تعمل من أجلي

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

الإجابة القصيرة

في الخاص بك 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" يتصرف، تريد تحقيق نفس السلوك بنفس الوسائط.


افحص هذا إجابة ذات صلة

هذا يجب أن يعمل:

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

أنا أستخدم لوحة مفاتيح مخصصة لإدخال رقم سداسي عشري لذلك لا يمكنني عرض لوحة المفاتيح IMM ...

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

قد يظهر هذا الحل الأخير لوحة المفاتيح لتقسيم ثاني ويبوس مع مقابض الاختيار.

عند الدخول في لوحة المفاتيح يدخل ملء الشاشة، لا يسمى Ongloballayout. لتجنب ذلك، استخدم TextView # setImptions (int) أو في إعلان النص XML:

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

تحديث: وجدت فقط ما يستخدمه الحواريات لعدم عرض لوحة المفاتيح ولا يعمل في جميع الإصدارات:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
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);
    }
}

لقد أنفقت أكثر من يومين من العمل من خلال جميع الحلول المنشورة في الخيط ووجدتهم يفتقرون إلى طريقة أو بأخرى. متطلباتي الدقيقة هي الحصول على زر سوف مع عرض موثوقية بنسبة 100٪ أو إخفاء لوحة مفاتيح الشاشة. عندما تكون لوحة المفاتيح في حالتها المخفية، لا ينبغي إعادة الظهور، بغض النظر عن حقول الإدخال النقر فوق المستخدم. عندما يكون في حالته المرئية، يجب ألا تختفي لوحة المفاتيح أزرار النقر فوق المستخدم. هذا يحتاج إلى العمل على Android 2.2+ على طول الطريق إلى أحدث الأجهزة.

يمكنك أن ترى تنفيذ عمل لهذا التطبيق الخاص بي نظيفة rpn..

بعد اختبار العديد من الإجابات المقترحة على عدد من الهواتف المختلفة (بما في ذلك أجهزة Froyo و Gingerbread) أصبح من الواضح أن تطبيقات Android يمكنها موثوق:

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

يؤدي هذا إلى أن النشاط الحالي أن يتم حفظ حالته في حزمة، ثم يتم بدء النشاط، يمر عبر منطقي يشير إلى ما إذا كان يجب إظهار لوحة المفاتيح أو مخفية.

داخل طريقة OnCreate يتم تشغيل التعليمات البرمجية التالية:

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

إذا تم عرض لوحة المفاتيح الناعمة، فيمكن إخبار InputMethodmodmanager بإظهار لوحة المفاتيح وتعليم النافذة لجعل المدخلات الناعمة مرئية دائما. إذا كانت لوحة المفاتيح الناعمة مخفية، يتم تعيين windowsmanager.layoutparams.flag_alt_focusable_im.

يعمل هذا النهج بشكل موثوق على جميع الأجهزة التي اختبرتها - من هاتف HTC يبلغ من العمر 4 سنوات تشغيل Android 2.2 Up to A Nexus 7 يعمل 4.2.2. العيب الوحيد في هذا النهج هو أنك تحتاج إلى توخي الحذر مع التعامل مع الزر الخلفي. نظرا لأن التطبيق الخاص بي أساسا لديه شاشة واحدة فقط (حاسبة لها) يمكنني تجاوز OnBackpressed () والعودة إلى الشاشة الرئيسية للأجهزة.

بدلا من ذلك إلى هذا في كل مكان الحل, ، إذا كنت تريد إغلاق لوحة المفاتيح لينة من اي مكان دون وجود مرجع إلى حقل (EDITTEXT) الذي تم استخدامه لفتح لوحة المفاتيح، ولكن لا يزال مطلوبا للقيام بذلك إذا كان الحقل يركز، يمكنك استخدام هذا (من نشاط):

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

بفضل هذا حتى الإجابة, ، اشتقت ما يلي، في حالتي، تعمل بشكل جيد عند التمرير عبر شظايا رأي ...

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

أعلاه الإجابات تعمل من أجل سيناريو مختلف ولكن إذا كنت ترغب في إخفاء لوحة المفاتيح داخل عرض وتكافح للحصول على السياق الصحيح جرب هذا:

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

إذا كنت ترغب في إغلاق لوحة المفاتيح الناعمة أثناء وجود وحدة أو اختبار وظيفي، فيمكنك القيام بذلك عن طريق النقر فوق "الزر الخلفي" من الاختبار الخاص بك:

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

أضع "زر رجوع" في علامات الاقتباس، لأن ما سبق لا يؤدي إلى onBackPressed() للنشاط المعني. انها مجرد إغلاق لوحة المفاتيح.

تأكد من التوقف لفترة قصيرة قبل الانتقال، حيث يستغرق الأمر بعض الوقت لإغلاق الزر الخلفي، لذلك لن يتم تسجيل النقرات اللاحقة إلى وجهات النظر، وما إلى ذلك، وما إلى ذلك، حتى بعد وقفة قصيرة (1 ثانية طويلة بما فيه الكفاية IME ).

إليك كيفية القيام بذلك في Mono لنظام Android (AKA Monodroid)

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

هذا عملت بالنسبة لي لجميع سلوك لوحة المفاتيح الغريبة

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

أضف إلى نشاطك android:windowSoftInputMode="stateHidden" في ملف واضح. مثال:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>
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;
    }
});

استخدم هذا

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

لحالتي، كنت أستخدم SearchView في ActionBar. بعد قيام المستخدم بإجراء بحث، ستفتح لوحة المفاتيح مرة أخرى.

باستخدام InputMethodModmanager لم يغلق لوحة المفاتيح. اضطررت إلى clearfocus وتعيين عرض البحث القابل للتركيز على خطأ:

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

ما عليك سوى استخدام هذا الرمز الأمثل في نشاطك:

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

لدي القضية، حيث بلدي 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 );
}

لقد حاولت تقريبا كل هذه الإجابات، واجهت بعض القضايا العشوائية خاصة مع Samsung Galaxy S5.

ما في نهاية المطاف مع إجبار المعرض والاختباء، ويعمل تماما:

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

في بعض الحالات، يمكن أن تعمل هذه الطرق باستثناء جميع الآخرين. هذا يحفظ يومي :)

public static void hideSoftKeyboard(Activity activity) {
    if (activity != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (activity.getCurrentFocus() != null && inputManager != null) {
            inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
            inputManager.hideSoftInputFromInputMethod(activity.getCurrentFocus().getWindowToken(), 0);
        }
    }
}

public static void hideSoftKeyboard(View view) {
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top