我想在屏幕上点击编辑框之外的区域时隐藏软键盘。我该怎么做?
我想在屏幕上点击编辑框之外的区域时隐藏软键盘。我该怎么做?
我不得不编辑这个代码才能让它运行。添加了一个检查来判断当前焦点视图是否为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;
}
可能还有更顺畅的方法,但这个方法非常有效。
要强制隐藏键盘,您可以使用以下代码...我将其放在了一个名为“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);
}
}
1)使用findViewById()将父布局的引用传递到Java代码中。
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;
}
});
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;
}
hideSoftKeyboard()
方法添加到您的 EditText
的 onClickListener
的 onClick()
方法中。例如: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);
}
}
我有一个好的解决方案。我知道现在已经太晚了,但是当搜索时,大多数情况下会将此链接作为第一个链接显示。因此,这可能对其他人有所帮助。如果您单击任何文本/按钮,它将隐藏已经可见的软键盘。
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);
}
});
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;
}
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代码中的if语句。Daniel正在检查触摸事件是否在EditText
之外。由于我有许多EditViews
,因此我将代码更改为查找触摸事件是否在任何EditText
之内。
对我来说它运作良好,如有任何改进或错误,请告诉我。
android.R.id.content
将给出根视图。getChildAt(0)
可能用于检索我的EditTexts的父级。 - Gokhan ArikEditText
都在一个 LinearLayout
中。所以 view
是我的 LinearLayout
,我从这个 LinearLayout 中检索所有的 EditText
。你想要实现什么? - Gokhan Arik只需将输入类型设置为 null,就像这样
editText.setInputType(InputType.TYPE_NULL);
editText.setInputType(0);
对我有效果