点击EditText外隐藏输入框

本文介绍了两种在Android应用中实现点击EditText文本框之外的任意位置以隐藏软键盘的方法。第一种方法通过重写dispatchTouchEvent并判断点击位置来实现;第二种方法通过设置根布局的clickable属性,并监听点击事件来实现键盘的隐藏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推荐阅读:Android 判断当前点击位置是否在圆的内部

方法一:
重写dispatchTouchEvent,判断点击EditText之外则隐藏输入框。


@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        //获取activity中获取焦点的view
        View view = getCurrentFocus();
        if (isShouldHideInput(view, ev)) {
            hideInput(view);
        }
        return super.dispatchTouchEvent(ev);
    }
    // 必不可少,否则所有的组件都不会有TouchEvent了
    if (getWindow().superDispatchTouchEvent(ev)) {
        return true;
    }
    return onTouchEvent(ev);
}

private void hideInput(View view) {
    if (view != null) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

public boolean isShouldHideInput(View view, MotionEvent event) {
    if (view != null && (view instanceof EditText)) {
        int[] leftAndTop = {0, 0};
        //获取输入框当前的location位置,相对于父窗口里的坐标
        view.getLocationInWindow(leftAndTop);
        int left = leftAndTop[0];
        int top = leftAndTop[1];
        int bottom = top + view.getHeight();
        int right = left + view.getWidth();
        if (event.getX() > left && event.getX() < right &&
                event.getY() > top && event.getY() < bottom) {
            // 点击的是输入框区域,保留点击EditText的事件
            return false;
        } else {
            return true;
        }
    }
    return false;
}

方法二:
根布局添加clickable属性,设置点击事件隐藏输入框即可。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true">

    //....

</RelativeLayout>   
mRootView = ((RelativeLayout) this.findViewById(R.id.rootview));
mRootView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }
    }
});

参考:Android点击EditText文本框之外任何地方隐藏键盘的解决办法

android点击屏幕上EditText区域以外的任何地方隐藏键盘的方法

getLocationInWindow与getLocationOnScreen区别:

View.getLocationInWindow(int[] location)
一个控件在其父窗口中的坐标位置
获取在当前窗口内的绝对坐标,getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父窗口里的坐标。

start = (Button) findViewById(R.id.start);  
int []location=new int[2];  
start.getLocationOnScreen(location);  
int x=location[0];//获取当前位置的横坐标  
int y=location[1];//获取当前位置的纵坐标  

View.getLocationOnScreen(int[] location)

一个控件在其整个屏幕上的坐标位置
获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。

start = (Button) findViewById(R.id.start);  
int []location=new int[2];  
start.getLocationInWindow(location);  
int x=location[0];//获取当前位置的横坐标  
int y=location[1];//获取当前位置的纵坐标  

参考:android中getLocationInWindow 和 getLocationOnScreen的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值