إغلاق/إخفاء لوحة مفاتيح Android Soft




android-layout android-softkeyboard (20)

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

في المستمع OnClick استدعاء onEditorAction من EditText مع IME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

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

الحفر

أشعر أن هذه الطريقة أفضل وأبسط وأكثر توافقاً مع نمط تصميم Android. في المثال البسيط أعلاه (وعادةً في معظم الحالات الشائعة) سيكون لديك نص EditText له / لديها تركيز ، وعادةً ما يكون هو نفسه الذي يستدعي لوحة المفاتيح في المقام الأول (وهو بالتأكيد قادر على استدعائه في العديد من السيناريوهات الشائعة). وبهذه الطريقة نفسها ، ينبغي أن تكون هي الجهة التي تقوم بإصدار لوحة المفاتيح ، وعادة ما يمكن تنفيذها بواسطة ImeAction . فقط انظر كيف يعمل EditText مع android:imeOptions="actionDone" ، تريد تحقيق نفس السلوك بنفس الوسائل.

تحقق من هذه الإجابة ذات الصلة

لدي EditText و Button في EditText .

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


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

في v3.2.4_r1 تم إضافة setSoftInputShownOnFocus(boolean show) للتحكم في الطقس أو عدم عرض لوحة المفاتيح عندما يتم التركيز على TextView ، ولكن لا يزال يجب استخدام ما يلي:

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#setImeOptions(int) أو في تعريف XML TextView:

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

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

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

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

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

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


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

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

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

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

يمكن استخدام هذا لمنع لوحة المفاتيح الناعمة حتى يلمس المستخدم بالفعل editText View.


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

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

يرجى المحاولة تحت هذا الرمز في onCreate()

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

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

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


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

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

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

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


استخدم هذا

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

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

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

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

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

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

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"في ملف Manifest. مثال:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>

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

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

بفضل هذا الجواب 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);
    }
}

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

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

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

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

يمكنك رؤية تنفيذ عملي لهذا في My app نظيف 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);
}

إذا كان يجب عرض لوحة المفاتيح الناعمة ، فسيُطلب من InputMethodManager إظهار لوحة المفاتيح وإرشاد النافذة لجعل الإدخال الناعم مرئيًا دائمًا. إذا كان يجب إخفاء لوحة المفاتيح الناعمة ، فسيتم تعيين WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM.

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


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




soft-keyboard