Как скрыть мягкую клавиатуру на андроиде после нажатия вне EditText? - PullRequest
317 голосов
/ 12 ноября 2010

Хорошо, все знают, что для того, чтобы спрятать клавиатуру, вам нужно реализовать:

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

Но здесь важно то, как спрятать клавиатуру, когда пользователь касается или выбирает любое другое место, которое не EditText или softKeyboard?

Я пытался использовать onTouchEvent() на моем родителе Activity, но это работает только в том случае, если пользователь касается внешнего вида и нет прокрутки.

IПопытка реализовать прослушивание касанием, щелчком, фокусировкой безуспешно.

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

Есть ли стандартный способ сделать это ??в iPhone это было действительно легко.

Ответы [ 40 ]

0 голосов
/ 16 июня 2019

Это самое простое решение для меня (и разработанное мной).

Это способ скрыть клавиатуру.

public void hideKeyboard(View view){
        if(!(view instanceof EditText)){
            InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
        }
    }

теперь установите атрибут onclick родительского макета действия для вышеуказанного метода hideKeyboard либо из представления Design вашего XML-файла, либо написав следующий код в текстовом представлении вашего XML-файла.

android:onClick="hideKeyboard"
0 голосов
/ 04 марта 2013

Я получил эту работу с небольшим вариантом решения Фернандо Камараго. В моем методе onCreate я присоединяю один onTouchListener к корневому представлению, но отправляю представление, а не деятельность в качестве аргумента.

        findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {           
        public boolean onTouch(View v, MotionEvent event) {
            Utils.hideSoftKeyboard(v);
            return false;
        }
    });

В отдельном классе Utils есть ...

    public static void hideSoftKeyboard(View v) {
    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
0 голосов
/ 13 февраля 2014

Вы можете легко переопределить событие onKey () в активности и фрагментах, чтобы скрыть клавиатуру.

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (keyCode == event.KEYCODE_ENTER) {

            intiateLoginProcess();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                    .getWindowToken(), 0);

            return true;
        }
    }
    return false;
}
0 голосов
/ 28 февраля 2014

Эй, ребята, у меня есть простое решение этой проблемы, и это решение может быть использовано для простой регистрации или формы входа. мое решение такое же, как я реализовал в ios setontouch listener для основного вида

activity_main.xml добавить идентификатор в ваш основной относительный макет android:id="@+id/mainlayout"

и добавьте этот код в свою деятельность

  RelativeLayout mainLayout = (RelativeLayout)findViewById(R.id.mainlayout);
  mainLayout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                 Log.d("Json Response", "Touch outside");
                  InputMethodManager inputMethodManager = (InputMethodManager)  MainActivity.this.getSystemService(Activity.INPUT_METHOD_SERVICE);
                    inputMethodManager.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), 0);
                return false;
            }
        });
0 голосов
/ 22 апреля 2015

Я думал, что это проблема.Во-первых, я думаю, что setOnTouchListener - не простое решение.поэтому я считаю, что dispatchTouchEvent - лучшее простое решение.

public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_UP) {
        View v = getCurrentFocus();
        if (v instanceof EditText) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }
    return super.dispatchKeyEvent(event);
}

здесь важно ACTION_UP.

Я предполагал, что EditText показывает только программную клавиатуру, в противном случае не показывает клавиатуру.Я тестировал на Android5.0.1 (G3.cat6 от LG).

, если вам нужна проверка перетаскивания, длинный щелчок, ..., показывать комментарии выше.

0 голосов
/ 30 декабря 2016

Мне удалось спрятать клавиатуру изнутри onItemClick AutoCompleteTextView

public void onItemClick(AdapterView<?> adapterViewIn, View viewIn, int indexSelected, long arg3) {
     InputMethodManager imm = (InputMethodManager) getSystemService(viewIn.getContext().INPUT_METHOD_SERVICE);
     imm.hideSoftInputFromWindow(viewIn.getApplicationWindowToken(), 0);
     // your code HERE
}
0 голосов
/ 25 ноября 2016
setupUI((RelativeLayout) findViewById(R.id.activity_logsign_up_RelativeLayout));

Передайте метод в файл макета.Вы должны выбрать свой общий файл макета в XML.Потому что клавиатурная шкура работает со всей раскладкой.

public void setupUI(View view) {
        // Set up touch listener for non-text box views to hide keyboard.
        if (!(view instanceof EditText)) {
            view.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) {
                    hideSoftKeyboard(Your Context); // Pass your context
                    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);
            }
        }
    }
0 голосов
/ 12 ноября 2010

Другая идея - переопределить метод onInterceptTouchEvent в корневом представлении для вашей активности.

Событие касания идет от самого переднего вида на экране (где произошло событие касания) вниз по стеку представлений, вызывающих метод onTouch, пока любое из представлений не вернет true, указывая, что событие касания былопотребляются.Поскольку многие представления по умолчанию используют событие касания (например, EditText или TextView), событие не попадает в корневой метод представления Activity onTouch.

Но, прежде чем сделать этот обход, событие касания проходит другой путь, проходя от корневого представления вниз по дереву представления, пока не достигнет самого переднего представления.Этот обход осуществляется путем вызова onInterceptTouchEvent.Если метод возвращает true, он перехватывает событие ... нет, но это немного хитрость, я не думаю, что вы хотите это сделать, ни узнать подробности.Что вам нужно знать, так это то, что вы можете переопределить этот метод в корневом представлении для вашего Activity и поместить туда код, чтобы при необходимости скрыть клавиатуру.

0 голосов
/ 24 января 2016

Мое решение скрывает клавиатуру при внешнем щелчке в любом действии со всеми редактируемыми текстами.Без указания их один за другим.

Сначала добавьте в корневой вид макета xml: android: clickable = "true" android: focusableInTouchMode = "true"

Далее создайте одного родителяАктивность всех действий, которые вы хотите скрыть клавиатурой, и указать метод onResume ():

 @Override
    protected void onResume() {
        super.onResume();
        //getting Root View that gets focus
        View rootView =((ViewGroup)findViewById(android.R.id.content)).
                getChildAt(0);
        rootView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    hideKeyboard(AbstractActivity.this);
                }
            }
        });
    }

Расширьте свою активность с помощью этой общей операции (мощность наследования!), И это все, каждый раз, когда любой EditText (на любом расширенномActivity) потеряет фокус, клавиатура будет скрыта.

PS метод hideKeyboard:

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

context.getCurrentFocus () не требует указания конкретного представления EditText ..

0 голосов
/ 10 апреля 2016

Вы можете попробовать способ ниже, он прекрасно работает для меня :)

Этот способ может быть применен для Activity или Fragment, и он также совместим со ScrollView.

Мы помещаем ScrollView в качестве макета верхнего уровня, объявляем id parentView для LinearLayout внутри и добавляем два атрибута, как показано ниже:

android:id="@+id/parentView"
android:clickable="true"
android:focusableInTouchMode="true"

В коде напишите функцию, как показано ниже:

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

Затем зарегистрируйте OnFocusChangeListener для корневого представления (запись в методе onCreate), чтобы затронуть весь EditText в Activity:

parentLayout.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    hideSoftKeyboard(your_activity_name.this);
                }
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...