android - إغلاق / إخفاء لوحة المفاتيح الروبوت لينة


لدي EditText Button في تخطيط بلدي.

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

أين يمكنني العثور على مثال على ذلك؟



Answers


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




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

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

هذا هو ما يجعل إخفاء لوحة المفاتيح صعبة للغاية. عزيزي جوجل: عندما أبحث عن وصفة كعكة، لا يوجد RecipeProvider على الأرض التي من شأنها أن ترفض أن 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 مستضافة في EditText ؟ لا يمكنك استخدام الطريقة أعلاه لذلك:

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

هذا لن يعمل لأنك سوف تمرير إشارة إلى Activity المضيف Fragment ، والتي لن يكون لها السيطرة على التركيز في حين يتم عرض Fragment ! نجاح باهر لذلك، لإخفاء لوحة المفاتيح من شظايا، وأنا اللجوء إلى مستوى أدنى، وأكثر شيوعا، وأبشع:

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

وفيما يلي بعض المعلومات الإضافية التي تم جمعها من مزيد من الوقت الضائع مطاردة هذا الحل:

حول ويندوسوفتينبتمود

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

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

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

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




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

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

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




حصلت على حل واحد أكثر لإخفاء لوحة المفاتيح:

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

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




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

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



تحديث: أنا لا أعرف لماذا هذا الحل لا يعمل أي أكثر (أنا فقط اختبار على الروبوت 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);



protected void hideSoftKeyboard(EditText input) {
    input.setInputType(0);
    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();
    }
}

ثم تأكد من أن EditText من 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);



سوراب باريك لديه أفضل إجابة حتى الآن.

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

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



الجواب القصير

في المستمع onEditorAction استدعاء 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);



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

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

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

عندما في لوحة المفاتيح يدخل كامل الشاشة، أونغلوباللايوت لا يسمى. لتجنب ذلك، استخدم تكستفيو # سيتيموبتيونس (إنت) أو في تكستفيو شمل إعلان:

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



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

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



لقد قضيت أكثر من يومين العمل من خلال جميع الحلول المنشورة في موضوع ووجدت لهم تفتقر بطريقة أو بأخرى. بلدي الشرط الدقيق هو أن يكون زر من شأنها أن مع موثوقية 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);
    }
}

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

داخل أسلوب 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);
}

إذا كان ينبغي أن تظهر لوحة المفاتيح لينة، ثم يتم InputMethodManager لإظهار لوحة المفاتيح ويتم إرشاد الإطار لجعل المدخلات لينة مرئية دائما. إذا كانت لوحة المفاتيح لينة يجب أن تكون مخفية ثم يتم تعيين WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM .

هذا النهج يعمل بشكل موثوق على جميع الأجهزة لقد اختبرت على - من الهاتف هتس القديمة 4 سنوات تشغيل الروبوت 2.2 تصل إلى العلاقة 7 تشغيل 4.2.2. العيب الوحيد مع هذا النهج هو تحتاج إلى توخي الحذر مع التعامل مع زر العودة. كما بلدي التطبيق أساسا فقط شاشة واحدة (آلة حاسبة لها) يمكنني تجاوز onBackPressed() والعودة إلى الشاشة الرئيسية الأجهزة.




وبفضل هذا الجواب سو ، استنتجت ما يلي، في حالتي، يعمل بشكل جيد عند التمرير من خلال شظايا من فيوباجر ...

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




وهنا كيف يمكنك أن تفعل ذلك في مونو لالروبوت (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"/>



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

باستخدام InputMethodManager لا إغلاق لوحة المفاتيح. اضطررت الى clearFocus وتعيين القابل للتركيز من وجهة نظر البحث إلى false:

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



استخدم هذا

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



لقد حاولت تقريبا كل هذه الإجابات، وكان لي بعض القضايا عشوائية خصوصا مع المجرة 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);
}



بسيطة وسهلة الاستخدام طريقة، مجرد دعوة 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);
}



مجرد استخدام هذا الرمز الأمثل في النشاط الخاص بك:

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



هل يمكن أن ننظر أيضا في استخدام setImeOption على EDITTEXT.

لقد كان الوضع مزيف جدا حيث يتضمن تخطيط بلدي وEDITTEXT وزر البحث. عندما اكتشفت أنني يمكن أن مجرد مجموعة الخيار IME ل"actionSearch" على بلدي EDITTEXT، أدركت أنني لم تحتاج حتى زر البحث بعد الآن. لوحة المفاتيح لينة (في هذا الوضع) لديه رمز البحث، والتي يمكن استخدامها لبدء البحث (ولوحة المفاتيح يغلق نفسه كما تتوقعون).