Скрыть клавиатуру в андроиде, прикоснувшись к внешней части Редактировать текстовую область

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

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

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

Ответ 1

Код для отклонения Softkeyboard находится ниже:

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

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

Вы можете написать метод, который выполняет итерацию через каждый вид в вашей активности и проверяет, является ли это экземпляром 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))

Ответ 2

Лучший способ, которым вы можете использовать, - Кнопка 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);
}
});

Ответ 3

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

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

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

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