放置在滚动视图中时如何从editText中关闭键盘

时间:2012-12-06 05:36:42

标签: android

大家好我创建了一个登录表单,其中我有编辑文本和按钮放置在滚动视图中。我想要的是当我在编辑文本外部触摸时解除键盘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;
    }
});

5 个答案:

答案 0 :(得分:4)

您正在通过返回

来使用ScrollView的触摸事件
return true;

返回false

它会向父母提供触摸事件。

答案 1 :(得分:3)

描述

我遇到了同样的问题并通过以下更改修复了它。他们的技巧是允许父滚动视图在没有其他子视图需要时抓住焦点。要使其工作,滚动视图必须是可单击且可聚焦的。这比使用onTouchEventonInterceptTouchEvent更好,因为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
       }
   })