单击android时隐藏默认键盘

时间:2010-10-23 19:41:48

标签: android

我想在屏幕中点击编辑框的一侧时隐藏软键盘。我怎么能这样做?

10 个答案:

答案 0 :(得分:58)

必须编辑这个以使其工作。添加了一个检查以查看焦点视图是否为EditText。

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

    if (v instanceof EditText) {
        View w = getCurrentFocus();
        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];

        Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
        if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 

            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
        }
    }
return ret;
}

可能会以更顺畅的方式完成,但效果确实很好。

答案 1 :(得分:32)

要强制隐藏键盘,您可以使用以下代码...我将它放在一个名为'hideSoftKeyboard()'的方法中。正如Falmarri所提到的,当你点击它时,软键盘应该隐藏起来。但是,如果您在另一个项目的“onClick()”中调用此方法,它将强行关闭键盘。

private void hideSoftKeyboard(){
    if(getCurrentFocus()!=null && getCurrentFocus() instanceof EditText){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(yourEditTextHere.getWindowToken(), 0);
    }
}

答案 2 :(得分:7)

这可以使用以下代码完成:

1)使用findViewById()将您的父布局引用到java代码中。

2)然后将setOnTouchListener()应用于它。

3)在onTouchMethod()中添加以下代码。

 lin = (LinearLayout) findViewById(R.id.lin);
    lin.setOnTouchListener(new OnTouchListener() 
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) 
        {
               InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                               imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
                       return false;
        }
    });

答案 3 :(得分:6)

我在活动中添加了以下内容。它的工作原理是因为在可聚焦视图外触摸不会改变焦点(所以w == v),但触摸将在视图的矩形之外。

public boolean dispatchTouchEvent(MotionEvent event) {
    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);
    View w = getCurrentFocus();
    int scrcoords[] = new int[2];
    w.getLocationOnScreen(scrcoords);
    float x = event.getRawX() + w.getLeft() - scrcoords[0];
    float y = event.getRawY() + w.getTop() - scrcoords[1];

    Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
    if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 
        inputManager.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
    }
    return ret;

}

[编辑:修复小错误]

答案 4 :(得分:0)

public boolean OutsideTouchEvent(MotionEvent m_event) {
    View v = getCurrentFocus();
    boolean value = super.dispatchTouchEvent(m_event);
    View w = getCurrentFocus();
    int scrcoords[] = new int[2];
    w.getLocationOnScreen(scrcoords);
    float x = m_event.getRawX() + w.getLeft() - scrcoords[0];
    float y = m_event.getRawY() + w.getTop() - scrcoords[1];

    if (m_event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 
        InputMethodManager inputMethodManager = (InputMethodManager)  YourActivity.this.getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(YourActivity.this.getCurrentFocus().getWindowToken(), 0);
    }
    return value;

}

答案 5 :(得分:0)

为编辑文本设置inputType为零   editText.setInputType(0);

这对我有用

答案 6 :(得分:0)

首先感谢Daniel,他的代码非常好,我使用它已经有一段时间了。

最近我意识到我必须改进它。问题是滚动页面。我的项目中有很多EditText个,当你滚动页面时它隐藏了键盘。

我使用onGestureListener提出了一个解决方案,而不是覆盖dispatchTouchEvent.

public class TabActivity extends ActionBarActivity implements GestureDetector.OnGestureListener {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        ...
        gestureScanner = new GestureDetector(TabActivity.this,this);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        gestureScanner.onTouchEvent(ev);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        View v = getCurrentFocus();

        if (v instanceof EditText) {
            View w = getCurrentFocus();
            int scrcoords[] = new int[2];
            w.getLocationOnScreen(scrcoords);
            boolean hide = true;

            View view = ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0);
            ArrayList<View> editTexts = view.getFocusables(0);     // Get All EditTexts in view

            for(int i=0; i< editTexts.size(); i++){
                View editText = editTexts.get(i);
                editText.getLocationOnScreen(scrcoords);
                float x = event.getRawX();
                float y = event.getRawY();
                int viewX = scrcoords[0];
                int viewY = scrcoords[1];

                // If touch is in any of EditText, keep keyboard active, otherwise hide it.
                if (event.getAction() == MotionEvent.ACTION_UP  && ( x > viewX && x < (viewX + editText.getWidth())) && ( y > viewY && y < (viewY + editText.getHeight())) ) {
                    hide = false;
                }
            }

            if (hide) {
                InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
            }
        }
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent event, MotionEvent e2, float distanceX, float distanceY) {
        return true;
    }     
}

因此,如果用户滚动页面,它将转到onScroll方法并且它什么都不做。如果用户只是触摸屏幕,则触发onSingleTapUp方法。

我还必须改变Daniel的代码陈述。 Daniel正在检查触摸事件是否在EditText之外。由于我有很多EditViews我更改了代码以查找触摸事件是否位于EditText的任何内部。

它适用于我,让我知道任何改进或错误。

答案 7 :(得分:0)

只需将输入类型设置为null

即可

editText.setInputType(InputType.TYPE_NULL);

答案 8 :(得分:0)

作为对已接受答案的补充。

如果接受的答案不适合您,您可以将hideSoftKeyboard()方法添加到onClick() onClickListener的{​​{1}}方法中。例如:

EditText

(将上述代码放在editText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { hideSoftKeyboard(); } }); 或其他地方)

PS。 onResume()

的定义
hideSoftKeyboard()

答案 9 :(得分:0)

我得到了一个很好的解决方案。我知道它为时已晚,但在搜索大多数时候将此链接作为第一个链接。所以它可能对其他人有帮助。如果单击任何文本/按钮,它将隐藏已经可见的软键盘。

date.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Hide soft keyboard
       InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

      // here i am showing the Date Dialog. one can proceed with their functionality

            //show date picker dialog
            showDialog(Date_DIALOG_ID);
        }
    });