- 浏览: 69424 次
- 性别:
- 来自: 北京
最新评论
当点击文本框和发送按钮的时候不需要取消键盘,点击屏幕其他按钮或者其他控件的时候消失键盘
解决方案一:
为了测试,把父布局设置成可点击可获取交点的。如下:
主要逻辑代码如下:
经过测试发现,当弹出键盘的时候点击输入框仍然会取消键盘然后再次弹出键盘。这个问题是因为当弹起键盘的时候键盘会挤压屏幕,导致点击的坐标被判断在指定的布局之外所以就取消键盘,但同时输入框获取了焦点所以又再次弹出键盘,解决这个问题只需要让屏幕不被键盘挤压即可,代码如下:
解决方案二:
获取相对于屏幕的点击位置和控件位置,即将getX(),getY()改成getRawX(),getRawY()。
getX()是表示Widget相对于自身右上角的x坐标二getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕右上角是手机屏幕右上角,不管Activity是否有titleBar或者是全屏),getY(),getRawY()一样的道理。
代码如下:
不限制屏幕滚动:
修改获取坐标的方法:
本例中使用v.getLocationInWindow或者是 v.getLocationOnScreen都行,是因为屏幕中就一个界面。所以两种方法获取的位置一样,最后有观月这两个方法的区别
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
解决方案一:
为了测试,把父布局设置成可点击可获取交点的。如下:
<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
发表评论
-
通过Url打开app页面并传递参数
2017-12-09 17:56 3924转载请注明出处:http:// ... -
Retrofit+RxJava搭建网络请求和数据解析框架
2017-06-29 18:20 0好久没写博客了,实话说,这一年相比往年可以说没什么进步,工作四 ... -
viewpager指示器
2016-11-08 16:04 0viewpager指示器 实现该需求的几种方法的基本原理和缺点 ... -
Android Studio模板,省去界面重复部分的开发
2016-07-06 16:05 0Android Studio模板,省去界面重复部分的开发 -
android studio 运行java代码
2016-06-21 17:50 2380转载请注明出处: http://renyuan-1991.it ... -
自定义组合控件的总结
2016-06-21 16:27 1496自定义组合控件的总结 转载请注明出处:http://renyu ... -
只显示年月的DatePicker
2016-06-12 17:30 3300转载请注明出处:http://renyuan-1991.ite ... -
Android的约束布局ConstaintLayout
2016-06-24 15:05 9851ConstaintLayout的初次使用总结 转载请注明出处 ... -
Android遮罩层引导页的实现
2016-06-03 16:28 0实现遮罩层引导页可以通过以下几种方式,本文主要记录张洪洋Hig ... -
手势密码
2016-05-24 14:52 0我们公司做的是理财产品,所以手势密码这个东西少不了,在写手势密 ... -
线性布局的权重weight使用详解
2016-01-20 14:29 2364对线性布局中权重的理解 转载请注明出处:http://ren ... -
setBackgroundResource导致Padding失效,settextsize
2016-01-18 19:50 1536通过setBackground设置9 patc ... -
NestedScrolling的使用及ScrollView的惯性滑动
2015-12-08 18:14 21466NestedScrolling的使用及ScrollView的惯 ... -
android-async-http使用和取消请求
2015-10-15 12:06 4944android-async-http使用总结 下载最新的包可以 ... -
四种方式实现ListView中的倒计时一()
2015-09-29 12:33 0的奋斗奋斗奋斗 -
SQLite详解
2015-10-10 15:07 1060概述 SQLite是D.Richar ... -
android 的屏幕适配问题,dp与px的换算
2015-08-08 19:11 1719在进入正题之前先了解 ... -
自定义ViewGroup实现动态创建可换行标签
2015-08-03 15:15 1149转载请注明:http://renyua ... -
Android第三方框架之xListView的使用方法
2014-11-09 19:18 5104==最近向用xListView实现刷新效果,在网上没有找到相关 ...
相关推荐
当您使用触摸屏时,阻止 caribou(屏幕键盘)弹出。即使它在无障碍服务菜单中被禁用。
如何用Windows 7开启或关闭屏幕键盘
4、热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的框架支持。
方配触摸屏浏览器是一款...4、 热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的
4、热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的框架支持。
锁闭屏幕可以支持手机锁闭后,触摸屏幕即可解锁,利用滑动解锁界面提供滑动导航面板解锁常用功能。锁闭手机锁模式需要利用按键、距离感应或者双敲击解锁方式解锁,该功能模拟了系统侧滑键的功能,有震动反馈效果。...
它的所有方面都在起作用,包括暂停,恢复,音频,旋转,触摸,在平板电脑模式下禁用键盘和触摸板。 在平板电脑模式下,它甚至会自动调出屏幕上的键盘,并将焦点移至文本输入上。 所有这些都在ubuntu 20.04 LTS上...
取消键盘 109 移动键盘下面的内容 109 描画文本 113 在Web视图中显示内容 113 文件和网络 114 文件和数据管理 114 常用目录 114 备份和恢复 115 在应用程序更新过程中被保存的文件 116 Keychain数据 116 获取应用...
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(终端模拟器)
触摸屏用户可以不再受滚动条限制,在屏幕上任意地方都可以进行拖动 选择键盘映射为其它时无法再次更改的BUG 用户输入的颜色值无法保存的BUG 修正英文单词分词时会多添加一个空行的BUG 繁体语言措词上的修正 阅读设置...
触摸板(Trackpad): 选中轻点来点按(用起来方便) 修改辅助点按为点按右下角 程序坞(Docker): Dock只放置常用App 大小设置到最小(拖到最左边),以显示最小图标 选中自动显示和隐藏程序坞,建议移动至左侧 键盘...
未实现的功能是: 切换静音/取消静音麦克风切换启用/禁用触摸板键盘亮度调节风扇曲线控制在屏幕上显示AniMe矩阵控件(可用概念验证) 注意:当前,默认配置文件期望电源计划“高性能”和“平衡”可用。 如果您的...
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 软件特性和...
实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 实例032 不可移动的窗体 实例033 始终在最上面的窗体 实例034 动画显示窗体 实例035 以时钟显示界面窗体 1.10 窗体标题栏应用实例 实例036 闪烁的...
实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 实例032 不可移动的窗体 实例033 始终在最上面的窗体 实例034 动画显示窗体 实例035 以时钟显示界面窗体 1.10 窗体标题栏应用实例 实例036 闪烁的...
cc实例029 自动运行的多媒体宣传光盘 1.8 多媒体触摸屏程序应用实例 cc实例030 采购中心多媒体触摸屏程序 cc实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 cc实例032 不可移动的窗体 cc实例...
cc实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 cc实例032 不可移动的窗体 cc实例033 始终在最上面的窗体 cc实例034 动画显示窗体 cc实例035 以时钟显示界面窗体 1.10 ...
cc实例031 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 cc实例032 不可移动的窗体 cc实例033 始终在最上面的窗体 cc实例034 动画显示窗体 cc实例035 以时钟显示界面窗体 1.10 ...