`
renyuan_1991
  • 浏览: 69424 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

触摸屏幕取消键盘

阅读更多
当点击文本框和发送按钮的时候不需要取消键盘,点击屏幕其他按钮或者其他控件的时候消失键盘
解决方案一:

     为了测试,把父布局设置成可点击可获取交点的。如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:clickable="true"
    tools:context=".MainActivity" >

    <LinearLayout
        android:id="@+id/ll"
        android:background="#11ff0000"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/et"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="8" />

        <Button
            android:id="@+id/bt"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:text="发送" />
    </LinearLayout>

</RelativeLayout>

主要逻辑代码如下:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ll = (LinearLayout) findViewById(R.id.ll);
		EditText et = (EditText) findViewById(R.id.et);
		Button bt = (Button) findViewById(R.id.bt);
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		if (ev.getAction() == MotionEvent.ACTION_DOWN) {
			// View v = getCurrentFocus();
			View v = ll;
			if (isShouldHideKeyboard(v, ev)) {
				hideKeyboard(v.getWindowToken());
			}
		}
		return super.dispatchTouchEvent(ev);
	}

	/**
	 * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
	 */
	private boolean isShouldHideKeyboard(View v, MotionEvent event) {
		if (v != null) {// 如果点击的是edittext
			int[] l = { 0, 0 };
			v.getLocationInWindow(l);// 获取v在窗口中的位置
			int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
					+ v.getWidth();
			// 判断点击的是不是在v的区域里面
			System.out.println("位置:(" + left + "," + top + ")(" + right + ","
					+ bottom + ")");
			System.out.println("event-x:" + event.getX());
			System.out.println("event-y:" + event.getY());
			if (event.getX() > left && event.getX() < right
					&& event.getY() > top && event.getY() < bottom) {
				// 点击的位置在v区域里面
				return false;
			} else {
				return true;
			}
		}
		// 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
		return false;
	}

	/**
	 * 获取InputMethodManager,隐藏软键盘
	 * 
	 * @param token
	 */
	private void hideKeyboard(IBinder token) {
		if (token != null) {
			InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			im.hideSoftInputFromWindow(token,
					InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}

	/**
	 * 点击空白位置 隐藏软键盘
	 */
	public boolean onTouchEvent(MotionEvent event) {
		if (null != this.getCurrentFocus()) {
			InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
			return mInputMethodManager.hideSoftInputFromWindow(this
					.getCurrentFocus().getWindowToken(), 0);
		}
		return super.onTouchEvent(event);
	}

经过测试发现,当弹出键盘的时候点击输入框仍然会取消键盘然后再次弹出键盘。这个问题是因为当弹起键盘的时候键盘会挤压屏幕,导致点击的坐标被判断在指定的布局之外所以就取消键盘,但同时输入框获取了焦点所以又再次弹出键盘,解决这个问题只需要让屏幕不被键盘挤压即可,代码如下:
<activity
            android:name="com.example.touchdissmis.MainActivity"
            android:windowSoftInputMode="adjustResize"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


解决方案二:
     获取相对于屏幕的点击位置和控件位置,即将getX(),getY()改成getRawX(),getRawY()。
     getX()是表示Widget相对于自身右上角的x坐标二getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕右上角是手机屏幕右上角,不管Activity是否有titleBar或者是全屏),getY(),getRawY()一样的道理。
     代码如下:
不限制屏幕滚动:
      
<activity
            android:name="com.example.touchdissmis.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


修改获取坐标的方法:

本例中使用v.getLocationInWindow或者是 v.getLocationOnScreen都行,是因为屏幕中就一个界面。所以两种方法获取的位置一样,最后有观月这两个方法的区别

private boolean isShouldHideKeyboard(View v, MotionEvent event) {
		if (v != null) {//如果点击的是edittext
			int[] l = { 0, 0 };
			v.getLocationOnScreen(l);//获取v在窗口中的位置
			int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth();
			//判断点击的是不是在v的区域里面
			System.out.println("位置:("+left+","+top+")("+right+","+bottom+")");
			System.out.println("event-x:"+event.getRawX());
			System.out.println("event-y:"+event.getRawY());
			if (event.getRawX() > left && event.getRawX() < right&& event.getRawY() > top && event.getRawY() < bottom) {
				// 点击的位置在v区域里面
				return false;
			} else {
				return true;
			}
		}
		// 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
		return false;
	}

getLocationInWindow与getLocationOnScreen的区别
getLocationInWindow
一个控件在其父窗口中的坐标位置
getLocationOnScreen
一个控件在其整个屏幕上的坐标位置
getLocationInWindow是以B为原点的C的坐标,而getLocationOnScreen以A为原点。
int[] location = new  int[2] ;
view.getLocationInWindow(location); //获取在当前窗口内的绝对坐标
view.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标
location [0]--->x坐标,location [1]--->y坐标
getLocationOnScreen
计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标
getLeft , getTop, getBottom,getRight, 这一组是获取相对在它父亲里的坐标

    转载请注明出处:http://renyuan-1991.iteye.com/blog/2248876
    希望爱好编程的小伙伴能加这个群,互相帮助,共同学习。群号: 141877583
0
0
分享到:
评论

相关推荐

    Ubuntu禁用软键盘,阻止 caribou(屏幕键盘)弹出.rar

    当您使用触摸屏时,阻止 caribou(屏幕键盘)弹出。即使它在无障碍服务菜单中被禁用。

    如何用Windows 7开启或关闭屏幕键盘

    如何用Windows 7开启或关闭屏幕键盘

    方配触摸屏浏览器(FPToucher) V1.7.2.5

    4、热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的框架支持。

    方配触摸屏浏览器(FPToucher) v1.8.11.13

    方配触摸屏浏览器是一款...4、 热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的

    方配触摸屏浏览器 FPToucher-v1.8.11.13

    4、热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的框架支持。

    滑动解锁 SlideUnlock 1.13

    锁闭屏幕可以支持手机锁闭后,触摸屏幕即可解锁,利用滑动解锁界面提供滑动导航面板解锁常用功能。锁闭手机锁模式需要利用按键、距离感应或者双敲击解锁方式解锁,该功能模拟了系统侧滑键的功能,有震动反馈效果。...

    c302ca:如何通过取消花式Chromebook上的保修来获得功能全面的ubuntu 20.04可转换笔记本电脑

    它的所有方面都在起作用,包括暂停,恢复,音频,旋转,触摸,在平板电脑模式下禁用键盘和触摸板。 在平板电脑模式下,它甚至会自动调出屏幕上的键盘,并将焦点移至文本输入上。 所有这些都在ubuntu 20.04 LTS上...

    iPhone应用程序开发指南.中文.pdf

    取消键盘 109 移动键盘下面的内容 109 描画文本 113 在Web视图中显示内容 113 文件和网络 114 文件和数据管理 114 常用目录 114 备份和恢复 115 在应用程序更新过程中被保存的文件 116 Keychain数据 116 获取应用...

    Development.apk(Android Dev Tools)

    1.2 Get By Type(通过类型获得) 1.3 Get All(显示全部) 1.4 Add(增加用户) ...1.5 Properties(属性) 1.6 features(特征) ...start sync(开始同步) cancel sync(取消同步)。 13. Terminal Emulator(终端模拟器)

    手机 pdf 阅读器

    触摸屏用户可以不再受滚动条限制,在屏幕上任意地方都可以进行拖动 选择键盘映射为其它时无法再次更改的BUG 用户输入的颜色值无法保存的BUG 修正英文单词分词时会多添加一个空行的BUG 繁体语言措词上的修正 阅读设置...

    java8源码-my-mac-setup:重装开发机(Mac)的笔记-开发IDE&配置,好用的工具,及一些个人经验

    触摸板(Trackpad): 选中轻点来点按(用起来方便) 修改辅助点按为点按右下角 程序坞(Docker): Dock只放置常用App 大小设置到最小(拖到最左边),以显示最小图标 选中自动显示和隐藏程序坞,建议移动至左侧 键盘...

    G14Manager:用于管理ROG Zephyrus G14的开源替代方案

    未实现的功能是: 切换静音/取消静音麦克风切换启用/禁用触摸板键盘亮度调节风扇曲线控制在屏幕上显示AniMe矩阵控件(可用概念验证) 注意:当前,默认配置文件期望电源计划“高性能”和“平衡”可用。 如果您的...

    android开发秘籍

    1.5.3 硬键盘和软键盘 8 1.6 android 开发 8 1.6.1 如何使用本书中的秘诀 8 .1.6.2 好好设计应用程序 9 1.6.3 保持向前兼容 9 1.6.4 健壮性 10 1.7 软件开发工具包 10 1.7.1 安装与更新 10 1.7.2 软件特性和...

    Visual C++程序开发范例宝典(光盘) 第四部分

    实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 实例032 不可移动的窗体 实例033 始终在最上面的窗体 实例034 动画显示窗体 实例035 以时钟显示界面窗体 1.10 窗体标题栏应用实例 实例036 闪烁的...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 实例032 不可移动的窗体 实例033 始终在最上面的窗体 实例034 动画显示窗体 实例035 以时钟显示界面窗体 1.10 窗体标题栏应用实例 实例036 闪烁的...

    Visual C++ 程序开发范例宝典 源码 光盘 part2

    cc实例029 自动运行的多媒体宣传光盘 1.8 多媒体触摸屏程序应用实例 cc实例030 采购中心多媒体触摸屏程序 cc实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 cc实例032 不可移动的窗体 cc实例...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     cc实例031 为触摸屏程序添加虚拟键盘   1.9 窗体位置应用实例   cc实例032 不可移动的窗体   cc实例033 始终在最上面的窗体   cc实例034 动画显示窗体   cc实例035 以时钟显示界面窗体   1.10 ...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     cc实例031 为触摸屏程序添加虚拟键盘   1.9 窗体位置应用实例   cc实例032 不可移动的窗体   cc实例033 始终在最上面的窗体   cc实例034 动画显示窗体   cc实例035 以时钟显示界面窗体   1.10 ...

Global site tag (gtag.js) - Google Analytics