Подтвердить что ты не робот

Скрыть клавиатуру по умолчанию при нажатии на андроид

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

4b9b3361

Ответ 1

Чтобы принудительно скрыть клавиатуру, вы должны использовать следующий код... Я положил его в метод под названием "hideSoftKeyboard()". Как уже упоминалось, Falmarri, экранная клавиатура должна скрываться, когда вы выходите из нее. Однако, если вы вызываете этот метод в "onClick()" другого элемента, он принудительно закрывает клавиатуру.

private void hideSoftKeyboard(){
    if(getCurrentFocus()!=null && getCurrentFocus() instanceof EditText){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(yourEditTextHere.getWindowToken(), 0);
    }
}

Ответ 2

Пришлось отредактировать это, чтобы заставить его работать. Добавлена ​​проверка, чтобы увидеть, является ли сфокусированный вид EditText.

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

    if (v instanceof EditText) {
        View w = getCurrentFocus();
        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];

        Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
        if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 

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

Возможно, это можно сделать более плавным способом, но он работает очень хорошо.

Ответ 3

В свою работу я добавил следующее. Это работает, потому что прикосновение к внешнему объекту Focusable View не изменяет фокус (так w == v), но прикосновение будет находиться вне прямоугольника View.

public boolean dispatchTouchEvent(MotionEvent event) {
    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);
    View w = getCurrentFocus();
    int scrcoords[] = new int[2];
    w.getLocationOnScreen(scrcoords);
    float x = event.getRawX() + w.getLeft() - scrcoords[0];
    float y = event.getRawY() + w.getTop() - scrcoords[1];

    Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
    if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 
        inputManager.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
    }
    return ret;

}

[edit: исправить незначительную ошибку] ​​

Ответ 4

Это можно сделать, используя следующий код:

1) Возьмите ссылку вашего родительского макета в java-код с помощью findViewById().

2), тогда примените к нему setOnTouchListener().

3) Добавьте следующий код в onTouchMethod().

 lin = (LinearLayout) findViewById(R.id.lin);
    lin.setOnTouchListener(new OnTouchListener() 
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) 
        {
               InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                               imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
                       return false;
        }
    });

Ответ 5

public boolean OutsideTouchEvent(MotionEvent m_event) {
    View v = getCurrentFocus();
    boolean value = super.dispatchTouchEvent(m_event);
    View w = getCurrentFocus();
    int scrcoords[] = new int[2];
    w.getLocationOnScreen(scrcoords);
    float x = m_event.getRawX() + w.getLeft() - scrcoords[0];
    float y = m_event.getRawY() + w.getTop() - scrcoords[1];

    if (m_event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 
        InputMethodManager inputMethodManager = (InputMethodManager)  YourActivity.this.getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(YourActivity.this.getCurrentFocus().getWindowToken(), 0);
    }
    return value;

}

Ответ 6

задайте для ввода текста тип ввода для ноль editText.setInputType(0);

он работает для меня

Ответ 7

Прежде всего, спасибо Дэниэлу, его код действительно хорош, и я использовал его некоторое время.

Недавно я понял, что должен его улучшить. Проблема заключалась в прокрутке страницы. У меня было много EditText в моем проекте, и он скрывал клавиатуру при прокрутке страницы.

Я придумал решение, используя onGestureListener вместо переопределения dispatchTouchEvent.

public class TabActivity extends ActionBarActivity implements GestureDetector.OnGestureListener {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        ...
        gestureScanner = new GestureDetector(TabActivity.this,this);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        gestureScanner.onTouchEvent(ev);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        View v = getCurrentFocus();

        if (v instanceof EditText) {
            View w = getCurrentFocus();
            int scrcoords[] = new int[2];
            w.getLocationOnScreen(scrcoords);
            boolean hide = true;

            View view = ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0);
            ArrayList<View> editTexts = view.getFocusables(0);     // Get All EditTexts in view

            for(int i=0; i< editTexts.size(); i++){
                View editText = editTexts.get(i);
                editText.getLocationOnScreen(scrcoords);
                float x = event.getRawX();
                float y = event.getRawY();
                int viewX = scrcoords[0];
                int viewY = scrcoords[1];

                // If touch is in any of EditText, keep keyboard active, otherwise hide it.
                if (event.getAction() == MotionEvent.ACTION_UP  && ( x > viewX && x < (viewX + editText.getWidth())) && ( y > viewY && y < (viewY + editText.getHeight())) ) {
                    hide = false;
                }
            }

            if (hide) {
                InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
            }
        }
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent event, MotionEvent e2, float distanceX, float distanceY) {
        return true;
    }     
}

Итак, если пользователь прокручивает страницу, он переходит к методу onScroll, и он ничего не делает. Если пользователи просто касаются экрана, он вызывает метод onSingleTapUp.

Мне также пришлось изменить, если вы указали код Daniel. Дэниел проверял, находится ли событие касания вне EditText. Поскольку у меня много EditViews, я изменил код, чтобы узнать, находится ли событие касания внутри любого из EditText s.

Он отлично работает со мной, дайте мне знать о каких-либо улучшениях или ошибках.

Ответ 8

Просто установите тип ввода как null

editText.setInputType(InputType.TYPE_NULL);

Ответ 9

В качестве дополнения к принятому ответу.

Если принятый ответ не работает для вас, вы можете добавить метод hideSoftKeyboard() к методу onClick() onClickListener вашего EditText. Например:

editText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyboard();
    }
});

(поместите вышеуказанный код в onResume() или в другое место)

пс. определение hideSoftKeyboard()

private void hideSoftKeyboard(){
    if(getCurrentFocus()!=null && getCurrentFocus() instanceof EditText){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }
}

Ответ 10

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

date.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Hide soft keyboard
       InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

      // here i am showing the Date Dialog. one can proceed with their functionality

            //show date picker dialog
            showDialog(Date_DIALOG_ID);
        }
    });