Скрыть клавиатуру во фрагменте

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

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

Я вызываю этот метод на view.onTouchListener

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

У кого есть решение, спасибо

В родительской активности фрагмента переопределяют следующий метод:

  @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if ( v instanceof EditText) { Rect outRect = new Rect(); v.getGlobalVisibleRect(outRect); if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) { v.clearFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } } return super.dispatchTouchEvent(event); } 

И в макете фрагмента используйте этот атрибут:

 android:focusableInTouchMode="true" 

Надеюсь, что это поможет вам.

Используйте этот метод, чтобы его работа прекратилась

 public static void hideKeyBoardMethod(final Context con, final View view) { try { view.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) con.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } }); } catch (Exception e) { e.printStackTrace(); } } 

Вы также можете сделать это

 getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN ); 

Надеюсь, это поможет!

Если вы хотите коснуться вне editText, тогда Keyboard скрыть автоматически, поэтому используйте этот код

 public boolean dispatchTouchEvent(MotionEvent event) { View view = getCurrentFocus(); boolean ret = super.dispatchTouchEvent(event); if (view instanceof EditText) { View w = getCurrentFocus(); int location[] = new int[2]; w.getLocationOnScreen(location); float x = event.getRawX() + w.getLeft() - location[0]; float y = event.getRawY() + w.getTop() - location[1]; if (event.getAction() == MotionEvent.ACTION_DOWN && (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; } 

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

 setupUI(rootView.findViewById(R.id.rootParent)) 

Код для установки UI ниже ..

 public void setupUI(View parentView) { //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(); handleCallBack(); return false; } }); } 

В случае использования фрагмента ниже кода

 View view = inflater.inflate(R.layout.fragment_test, container, false); view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE){ dispatchTouchEvent(event); } return true; } }); //here the rest of your code return view; 

Примените этот код и вызовите dispatchTouchEvent (); метод

Я просто решу эту проблему также. Как скрыть клавиатуру в фрагменте

Я просто переопределил метод dispatchTouchEvent () во всех фрагментах активности.

 @Override public boolean dispatchTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if ( v instanceof EditText) { Rect outRect = new Rect(); v.getGlobalVisibleRect(outRect); if (!outRect.contains((int)ev.getRawX(), (int)ev.getRawY())) { v.clearFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } } 

И установить свойство в каждом XML-фрагменте в основном макете

 android:focusableInTouchMode="true"