Закрыть / скрыть программную клавиатуру Android - PullRequest
3500 голосов
/ 10 июля 2009

У меня есть EditText и Button в моем макете.

После записи в поле редактирования и нажатия на Button я хочу скрыть виртуальную клавиатуру. Я предполагаю, что это простой кусок кода, но где я могу найти пример этого?

Ответы [ 92 ]

3 голосов
/ 20 декабря 2017

Вы можете просто добавить этот код, где вы хотите скрыть программную клавиатуру "

                        // Check if no view has focus:
                            View view = getCurrentFocus();
                            if (view != null) {
                                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                            }
2 голосов
/ 18 декабря 2012

Я создал макет частично из xml и частично из пользовательского механизма компоновки, который обрабатывается в коде. Единственное, что сработало для меня, - это отслеживать, была ли клавиатура открыта, и использовать метод переключения клавиатуры следующим образом:

public class MyActivity extends Activity
{
    /** This maintains true if the keyboard is open. Otherwise, it is false. */
    private boolean isKeyboardOpen = false;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        LayoutInflater inflater;
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View contentView = inflater.inflate(context.getResources().getIdentifier("main", "layout", getPackageName()), null);

        setContentView(contentView);
        contentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
        {
            public void onGlobalLayout() 
            {
                Rect r = new Rect();
                contentView.getWindowVisibleDisplayFrame(r);
                int heightDiff = contentView.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 100) 
                    isKeyboardVisible = true;
                else
                    isKeyboardVisible = false;
             });
         }
    }

    public void closeKeyboardIfOpen()
    {
        InputMethodManager imm;
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (isKeyboardVisible)
            imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    }   
}
2 голосов
/ 23 июля 2018

Вы можете создать Расширение для любого вида

fun View.hideKeyboard() = this.let {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

Пример использования с Activity

window.decorView.hideKeyboard();

Пример использования с View

etUsername.hideKeyboard();

Счастливое кодирование ...

2 голосов
/ 20 мая 2013

Испытал все здесь в отчаянии, комбинируя все методы, и, конечно, клавиатура не закрывается в Android 4.0.3 (она работала в Honeicomb AFAIR).

Затем я неожиданно обнаружил выигрышную комбинацию:

textField.setRawInputType(InputType.TYPE_CLASS_TEXT |InputType.TYPE_TEXT_VARIATION_NORMAL);

в сочетании с вашими обычными рецептами

blahblaj.hideSoftInputFromWindow ...

надеюсь, что это остановит кого-то от самоубийства .. Я был близок к этому. Конечно, я понятия не имею, почему это работает.

2 голосов
/ 07 июля 2014

Альтернативой использования SearchView будет использование этого кода:

searchView = (SearchView) searchItem.getActionView();    
searchView.setOnQueryTextListener(new OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        InputMethodManager imm = (InputMethodManager)
        getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(searchView.getApplicationWindowToken(), 0);
    }
}

Это окно поиска SearchView в панели действий, которое при отправке текста из запроса (пользователь нажимает либо клавишу Enter, либо кнопку / значок поиска), затем код InputMethodManager активируется и делает вашу программную клавиатура идти вниз. Этот код был вставлен в мой onCreateOptionsMenu(). searchItem от MenuItem, который является частью кода по умолчанию для onCreateOptionsmenu(). Спасибо @mckoss за хороший кусок этого кода!

2 голосов
/ 31 октября 2014

Несмотря на все эти ответы, просто для простоты я написал общий метод для этого:

/**
 * hide soft keyboard in a activity
 * @param activity
 */
public static void hideKeyboard (Activity activity){
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    if (activity.getCurrentFocus() != null) {
        InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
    }
}
2 голосов
/ 16 февраля 2019
there are two ways to do so...

method 1:in manifest file

define the line **android:windowSoftInputMode="adjustPan|stateAlwaysHidden"** of code in your manifest.xml file as below...

<activity
            android:name="packagename.youactivityname"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />

Method 2 : in Activity or Java class

 if(getCurrentFocus()!=null) {
            InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)`enter code here`;
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }

это будет работать .... @ ASK

2 голосов
/ 18 января 2014
public static void closeInput(final View caller) {  
    caller.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }, 100);
}

Этот метод обычно работает, но есть одно условие: вы не можете установить android:windowSoftInputMode="any_of_these" set

1 голос
/ 25 сентября 2018

для Xamarin.Android:

public void HideKeyboard()
{
    var imm = activity.GetSystemService(Context.InputMethodService).JavaCast<InputMethodManager>();
    var view = activity.CurrentFocus ?? new View(activity);
    imm.HideSoftInputFromWindow(view.WindowToken, HideSoftInputFlags.None);
}
1 голос
/ 29 августа 2017

Прочитав все ответы выше и в другом посте, мне все равно не удалось автоматически открыть клавиатуру.

В моем проекте я создал диалог (AlertDialog) динамически (программируя его без или с минимумом необходимого XML).

Итак, я делал что-то вроде:

    dialogBuilder = new AlertDialog.Builder(activity);

    if(dialogBuilder==null)
        return false; //error

    inflater      = activity.getLayoutInflater();
    dialogView    = inflater.inflate(layout, null);
    ...

И после завершения настройки всех представлений (TextView, ImageView, EditText и т. Д.) Я сделал:

        alertDialog = dialogBuilder.create();

        alertDialog.show();

Поиграв со всеми ответами, я обнаружил, что большинство из них работают ЕСЛИ вы знаете ГДЕ , чтобы поставить запрос ... И это был ключ ко всем.

Итак, хитрость заключается в том, чтобы поставить его ДО при создании диалога: alertDialog.show() в моем случае это сработало как шарм:

        alertDialog = dialogBuilder.create();           
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        //And only when everything is finished - let's bring up the window - 
        alertDialog.show();

        //Viola... keyboard is waiting for you open and ready...
        //Just don't forget to request focus for the needed view (i.e. EditText..)

Я совершенно уверен, что этот принцип одинаков для всех окон, поэтому обратите внимание на расположение вашего кода "showKeyboard" - это должно быть до запуска окна.

Небольшой запрос от команды разработчиков Android SDK:

Я думаю, что все это не нужно, поскольку тысячи программистов со всего мира имеют дело с этой нелепой и тривиальной проблемой, а ее решение должно быть простым и понятным: ИМХО, если я получу requestFocus() в представлении, ориентированном на ввод (например, EditText), клавиатура должна открыться автоматически, если пользователь не спросит не, поэтому, я думаю, что метод requestFocus () является ключом здесь и должен принять логическое showSoftKeyboard со значением по умолчанию true: View.requestFocus(boolean showSoftKeyboard);

Надеюсь, это поможет другим, таким как я.

...