我有以下代码:
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
public void setupDialog(View view) {
// 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 view, MotionEvent event) {
hideKeyboard(view);
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);
setupDialog(innerView);
}
}
}
public void setupEditTextFocusChangedListeners(View view) {
if (view instanceof EditText) {
view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus) {
((EditText) view).setSelection(((EditText) view).getText().length());
}
}
});
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupEditTextFocusChangedListeners(innerView);
}
}
}
当键盘在任何EditText字段外部单击或滚动时隐藏,当滚动时EditText仍然保持焦点,即使键盘确实关闭。
EditText字段采用表格格式。我知道我可以在clearFocus()
中单独调用每个EditText上的hideKeyboard
,但这似乎并不高效。滚动时是否有更有效的方法来清除EditText的焦点?
答案 0 :(得分:2)
由于只有一个EditText
可以聚焦,并且你有onFocused监听器,你可以:
private Edittext focused;
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus) {
((EditText) view).setSelection(((EditText) view).getText().length());
focused = view
}
}
然后在hideKeyboard()中:
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
focused.clearFocus();
}
答案 1 :(得分:1)
我认为这是一种可怕的做事方式。除了编辑文本之外,你将搞任何任何视图的触摸监听器,并且计算成本很高。我真的建议你不要这样做 - 这不是iOS,你可以按下后退键来摆脱键盘。试图让它以这种方式工作比它的价值更多的努力,并且很难做对。
忽略这一点 - 更好的方法是使您的滚视视图的根视图可以在BEFORE_DESCENDENTS的焦点上聚焦(并且可在触摸模式下聚焦),并将其聚焦于Click或onScroll。这样做意味着您不需要为层次结构中的每个视图设置onTouch,只需要设置基础。然后在你的根视图onFocus中,在获得焦点时隐藏键盘。