Я хочу скрыть мягкую клавиатуру, когда я выхожу из окна редактирования на экране. как я могу это сделать?
Скрыть клавиатуру по умолчанию при нажатии на андроид
Ответ 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);
}
});