Скрыть клавиатуру в Android при касании за пределами области редактирования текста

Я знаю, что код для отключения клавиатуры в Android

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Может ли кто-нибудь предложить мне способ скрыть клавиатуру, если мы коснемся области за пределами текстовой области, кроме клавиатуры на экране.


person Nithin Michael    schedule 13.12.2013    source источник
comment
Код вроде в порядке. Это заставит клавиатуру быть скрытой во всех ситуациях. В некоторых случаях вы передаете InputMethodManager.HIDE_IMPLICIT_ONLY в качестве второго параметра, чтобы убедиться, что вы скрываете клавиатуру только тогда, когда пользователь явно не заставлял ее появляться (удерживая меню).   -  person Linga    schedule 13.12.2013
comment
проверить мой ответ чтобы скрыть программную клавиатуру на Android после нажатия вне edittext"> stackoverflow.com/questions/4165414/   -  person Uzair    schedule 22.04.2016


Ответы (3)


Код для закрытия программной клавиатуры приведен ниже:

public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

Вы можете поместить его в служебный класс или, если вы определяете его в действии, избегайте параметра действия или вызывайте hideSoftKeyboard(this).

Вы можете написать метод, который перебирает каждое представление в вашей деятельности и проверяет, является ли он экземпляром EditText, если он не регистрирует setOnTouchListener для этого компонента, и все встанет на свои места. Если вам интересно, как это сделать, на самом деле это довольно просто. Вот что вы делаете, вы пишете рекурсивный метод, подобный следующему.

public void setupUI(View view) {

    //Set up touch listener for non-text box views to hide keyboard.
    if(!(view instanceof EditText)) {

        view.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                hideSoftKeyboard();
                return false;
            }

        });
    }

    //If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {

        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {

            View innerView = ((ViewGroup) view).getChildAt(i);

            setupUI(innerView);
        }
    }
}

Вызовите этот метод после SetcontentView() с параметром id вашего представления, например:

RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>

Затем позвоните setupUI(findViewById(R.id.parent))

person Sharmilee    schedule 13.12.2013
comment
копия stackoverflow.com/questions/4165414/ - person Gaurav; 12.08.2014
comment
Хотя лучшим ответом в приведенной выше ссылке был этот - stackoverflow.com/a/19828165/609782 Меньше кода, без итераций . - person Darpan; 01.12.2014

Лучший способ, которым вы можете использовать, это кнопка DONE, кроме EditText, чтобы ваш onClickListener делал что-то вроде,

done.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
}
});
person Jaydipsinh Zala    schedule 13.12.2013

Это может быть старым, но я получил это, внедрив собственный класс

public class DismissKeyboardListener implements OnClickListener { 

    Activity mAct;

    public DismissKeyboardListener(Activity act) {
        this.mAct = act;
    } 

    @Override 
    public void onClick(View v) {
        if ( v instanceof ViewGroup ) {
            hideSoftKeyboard( this.mAct );
        } 
    }        
} 

public void hideSoftKeyboard(Activity activity) {
        InputMethodManager imm = (InputMethodManager)
        getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
} 

наилучшей практикой здесь является создание класса Helper, и каждый контейнер Relative/Linear Layouts должен реализовать это.

**** Обратите внимание, что только основной контейнер должен реализовывать этот класс (для оптимизации) ****

и реализовать это так:

Parent.setOnClickListener( new DismissKeyboardListener(this) ); 

ключевое слово это для Activity. поэтому, если вы находитесь на фрагменте, вы используете его как getActivity();

---большой палец вверх, если это вам поможет... --- подбадривает Ральфа ---

person ralphgabb    schedule 17.10.2014