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




android-layout android-softkeyboard (24)

لدي EditText و Button في EditText .

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


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

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

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

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

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


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

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

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


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

بفضل هذا الجواب 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()إلى النشاط المعني. انها مجرد إغلاق لوحة المفاتيح.

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


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

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

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

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

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


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

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

في ما يلي طريقة تنفيذ ذلك في Mono لنظام Android (AKA MonoDroid)

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 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


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

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

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

استخدم هذا

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

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

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

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

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

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

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

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

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

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

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

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


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

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

أستخدم لوحة مفاتيح مخصصة لإدخال رقم سداسي عشري لذا لا يمكنني عرض لوحة مفاتيح 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);

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






soft-keyboard