描述
我遇到了同样的问题,并通过以下更改对其进行了修复。他们的诀窍是让父滚动视图在没有其他子视图需要时抓住焦点。为此,滚动视图必须是可点击和可聚焦的。这比使用onTouchEvent
或更好,onInterceptTouchEvent
因为 ScrollView 需要利用那些相当复杂的滚动行为。
代码更改
首先,在您的布局文件中将这些属性添加到滚动视图:
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
接下来,在您的代码中将这些侦听器添加到您的滚动视图中:
scrollableContent.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
onClickAway();
}
}
});
//this second listener is probably unnecessary but I put it in just in case there are weird edge cases where the scrollView is clicked but failed to gain focus
scrollableContent.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onClickAway();
}
});
最后,当用户点击离开表单中的字段时,实现您想要的任何行为:
/**
* Invoked when something is clicked that is not otherwise listening for click events, like when
* the user clicks outside of an EditText view.
*/
protected void onClickAway() {
//hide soft keyboard
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindowToken(), 0);
}
结果
随着这些变化的到位,滚动视图将在任何时候获得焦点,并且作为响应,它会隐藏键盘。请注意,如果单击任何其他需要键盘的字段,它们将优先,并且键盘将保持不变(即打开)。此外,您可以将 XML 属性和侦听器添加到 scrollView 的子 ViewGroup 中,虽然我还没有测试过,但我相信这也可以。