大家好我创建了一个登录表单,其中我有编辑文本和按钮放置在滚动视图中。我想要的是当我在编辑文本外部触摸时解除键盘fi已经实现了scrollview onTouch Listener来解除键盘但我想要的是。滚动和解雇键盘。它可能吗?下面是代码。
ScrollView sv=(ScrollView) findViewById(R.id.scroll);
sv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
InputMethodManager imm = (InputMethodManager) getSystemService( INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
return true;
}
});
答案 0 :(得分:4)
您正在通过返回
来使用ScrollView
的触摸事件
return true;
返回false
它会向父母提供触摸事件。
答案 1 :(得分:3)
我遇到了同样的问题并通过以下更改修复了它。他们的技巧是允许父滚动视图在没有其他子视图需要时抓住焦点。要使其工作,滚动视图必须是可单击且可聚焦的。这比使用onTouchEvent
或onInterceptTouchEvent
更好,因为ScrollView需要利用这些来进行相当复杂的滚动行为。
首先,在您的布局文件中将这些属性添加到scrollview:
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
接下来,在您的代码中将这些侦听器添加到您的scrollview:
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中,虽然我还没有对其进行测试,但我相信它也可以正常工作。
答案 2 :(得分:0)
您好我尝试了这个问题,这适用于我的案例
scrollView.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){if (event != null && event.getAction() == MotionEvent.ACTION_MOVE)
{
InputMethodManager imm = ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE));
boolean isKeyboardUp = imm.isAcceptingText();
if (isKeyboardUp)
{
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return false;}
});
答案 3 :(得分:0)
对于API23 +
scrollView.setOnScrollChangeListener { v, _, _, _, _ ->
v?.hideSoftKeyboard()
}
fun View.hideSoftKeyboard() {
(context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).apply {
hideSoftInputFromWindow(this@hideSoftKeyboard.windowToken, 0)
}
}
答案 4 :(得分:0)
就我而言,我能够在滚动时隐藏键盘,并且在编辑文本的外部单击。也许此代码可以提供帮助。科特林:
nestedScrollView.setOnTouchListener(object : View.OnTouchListener{
val inputManager =
activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
if (inputManager.isAcceptingText)
inputManager.hideSoftInputFromWindow(view.windowToken, 0)
return false
}
})