3

我创建了一个登录表单,我必须在其中编辑文本和按钮,它们位于滚动视图中。当我在编辑文本之外触摸时,我想关闭键盘。我已经实现了一个滚动视图 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;
    }
});
4

5 回答 5

4

你正在消费的触摸事件ScrollView您正在通过返回

return true;

刚回来false

它会将触摸事件提供给父级。

于 2012-12-06T05:40:54.963 回答
3

描述

我遇到了同样的问题,并通过以下更改对其进行了修复。他们的诀窍是让父滚动视图在没有其他子视图需要时抓住焦点。为此,滚动视图必须是可点击和可聚焦的。这比使用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 中,虽然我还没有测试过,但我相信这也可以。

于 2014-09-23T00:32:51.633 回答
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
       }
   })
于 2021-07-28T14:45:15.910 回答
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;}
 });
于 2018-05-29T13:40:33.537 回答
0

For API23+

scrollView.setOnScrollChangeListener { v, _, _, _, _ ->
    v?.hideSoftKeyboard()
}
fun View.hideSoftKeyboard() {
    (context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).apply {
        hideSoftInputFromWindow(this@hideSoftKeyboard.windowToken, 0)
    }
}
于 2020-04-03T20:59:01.500 回答