Скрыть виртуальную клавиатуру Android

У меня есть действие, которое показывает EditText и два основания.

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

Я видел сообщения здесь, в stackoverflow, с похожим вопросом, но это не похоже на работу. Я попытался установить слушателя:

   // Create an anonymous implementation of OnFocusChangeListener
   private OnFocusChangeListener mFocusListener = new OnFocusChangeListener() {
       public void onFocusChange(View v, boolean b) {
          // do something when the focus changes
        hideSoftKeyboard(v);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setupUI(findViewById(R.id.parent));
        EditText editText = (EditText) findViewById (R.id.edit_message);
        editText.setOnFocusChangeListener(mFocusListener);
        setContentView(R.layout.activity_main);
    }

Я также попытался создать родительское действие, которое рекурсивно связывает событие onTouch с каждым представлением, которое не является текстовым представлением, но регистрирует только текстовое представление (я взял этот фрагмент кода из другого поста stackoverflow)

    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(v);
                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);
        }
    }
}

Любое прямое решение для этого? Не могу поверить, что нет более простого способа сделать это. Я использую Gingerbread API (уровень API 10)

Спасибо


person Jorge    schedule 03.12.2012    source источник
comment
Что находится в вашей функции hideSoftKeyboard(View v)? ты смотрел этот пост? stackoverflow.com/questions/1109022/   -  person chris-tulip    schedule 04.12.2012


Ответы (2)


Хорошо, я нашел способ сделать это очень простым способом: определение макета XML. Поскольку Layout — это ViewGroup, мы можем реализовывать на нем события. Перейдите и определите метод обработки щелчка по макету (hideSoftKeyboard).

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:id="@+id/main_layout" 
    android:onClick="hideSoftKeyboard" >

И вот как я реализовал метод:

public void hideSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager)  getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
person Jorge    schedule 05.12.2012
comment
Спасибо, Хорхе. Это лучший способ сделать это. - person Rizwan Sohaib; 16.11.2015

Я использовал следующий метод для той же цели

private void hideKeypad(){
    EditText edtView=(EditText)findViewById(R.id.username);

    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(edtView.getWindowToken(), 0);
}
person stinepike    schedule 04.12.2012
comment
Это то, что у меня есть, но как вы вызываете этот звонок. Я хочу запускать его, когда я нажимаю на экран, а не в любом представлении. - person Jorge; 05.12.2012