- 浏览: 70593 次
- 性别:
- 来自: 北京
最新评论
当点击文本框和发送按钮的时候不需要取消键盘,点击屏幕其他按钮或者其他控件的时候消失键盘
解决方案一:
为了测试,把父布局设置成可点击可获取交点的。如下:
主要逻辑代码如下:
经过测试发现,当弹出键盘的时候点击输入框仍然会取消键盘然后再次弹出键盘。这个问题是因为当弹起键盘的时候键盘会挤压屏幕,导致点击的坐标被判断在指定的布局之外所以就取消键盘,但同时输入框获取了焦点所以又再次弹出键盘,解决这个问题只需要让屏幕不被键盘挤压即可,代码如下:
解决方案二:
获取相对于屏幕的点击位置和控件位置,即将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 3987转载请注明出处: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 2435转载请注明出处: http://renyuan-1991.it ... -
自定义组合控件的总结
2016-06-21 16:27 1559自定义组合控件的总结 转载请注明出处:http://renyu ... -
只显示年月的DatePicker
2016-06-12 17:30 3386转载请注明出处:http://renyuan-1991.ite ... -
Android的约束布局ConstaintLayout
2016-06-24 15:05 9931ConstaintLayout的初次使用总结 转载请注明出处 ... -
Android遮罩层引导页的实现
2016-06-03 16:28 0实现遮罩层引导页可以通过以下几种方式,本文主要记录张洪洋Hig ... -
手势密码
2016-05-24 14:52 0我们公司做的是理财产品,所以手势密码这个东西少不了,在写手势密 ... -
线性布局的权重weight使用详解
2016-01-20 14:29 2445对线性布局中权重的理解 转载请注明出处:http://ren ... -
setBackgroundResource导致Padding失效,settextsize
2016-01-18 19:50 1582通过setBackground设置9 patc ... -
NestedScrolling的使用及ScrollView的惯性滑动
2015-12-08 18:14 21581NestedScrolling的使用及ScrollView的惯 ... -
android-async-http使用和取消请求
2015-10-15 12:06 4998android-async-http使用总结 下载最新的包可以 ... -
四种方式实现ListView中的倒计时一()
2015-09-29 12:33 0的奋斗奋斗奋斗 -
SQLite详解
2015-10-10 15:07 1108概述 SQLite是D.Richar ... -
android 的屏幕适配问题,dp与px的换算
2015-08-08 19:11 1780在进入正题之前先了解 ... -
自定义ViewGroup实现动态创建可换行标签
2015-08-03 15:15 1220转载请注明:http://renyua ... -
Android第三方框架之xListView的使用方法
2014-11-09 19:18 5154==最近向用xListView实现刷新效果,在网上没有找到相关 ...
相关推荐
在轻松访问中心中,用户会看到一个“启动屏幕键盘”的选项,点击它后,一个全新的屏幕键盘界面将出现在电脑屏幕上,用户即可通过鼠标或触摸板进行操作。 如果用户在使用完毕后想要关闭屏幕键盘,操作也非常简单。只...
在Ubuntu操作系统中,Caribou是一款为触控设备设计的屏幕键盘软件,它会在用户进行输入操作时自动弹出,以方便触摸屏用户输入文本。然而,在某些情况下,用户可能不希望这个软键盘自动出现,比如在使用物理键盘或者...
屏幕键盘是一种常见的辅助工具,尤其在无物理键盘的设备或特定场景下,如触摸屏设备、远程桌面连接等。这个程序是使用Windows API编写的,Windows API(Application Programming Interface)是微软为开发者提供的...
- 在“工具栏”选项卡中,取消勾选“触摸键盘”前面的复选框。 - 点击“确定”以关闭设置并保存更改。 2. **通过任务栏快速关闭**: - 同样,右键点击任务栏,然后将鼠标悬停在“工具栏”上。 - 点击已打开的...
- 或者,您可以回到“任务栏设置”中,取消选中“触摸键盘”选项来禁用此功能。 触摸键盘提供了与实体键盘类似的输入体验,包括各种特殊字符、数字键盘以及快捷键。此外,触摸键盘还支持自定义布局和主题,以适应...
### 如何关闭Windows 8触摸键盘的敲击声 随着技术的发展,触摸屏设备变得越来越普遍,尤其是在Windows 8及Windows 8.1系统中,为了更好地适应平板电脑等新型设备,微软引入了触摸键盘的功能。触摸键盘不仅方便了...
- 查找“在我输入内容时播放按键声音”的选项,并根据需要勾选或取消勾选该选项来开启或关闭触摸键盘的声音。 #### 备注与注意事项 - 本指南基于Windows 8.1预览版编写,正式版本的操作流程可能存在差异,请以...
对于习惯了使用物理键盘的用户而言,Windows 8系统的触摸键盘虽然提供了一定程度上的便捷,但在功能上仍然存在局限,特别是在精确操作和特定软件使用方面。本文将详细介绍Windows 8系统标准触摸键盘开启方法,以帮助...
该库的工作原理是监听触摸事件,并在检测到触摸发生在键盘之外时,调用InputMethodManager的hideSoftInputFromWindow方法来隐藏键盘。这样,用户无需寻找特定的关闭按钮,只需单击屏幕空白处即可完成操作,提高了...
标题"输入框中点击任何地方都可以取消输入键盘"所涉及的知识点,主要是如何实现一个功能,使得用户在输入框中输入时,只需点击屏幕上的任意位置就能关闭软键盘,而不仅仅是点击输入框之外的地方。这种功能常见于各种...
-- 同样防止在触摸模式下获取焦点 --> /> ``` 然而,仅仅禁止软键盘还不够,我们还需要创建一个自定义键盘。自定义键盘可以通过创建一个布局文件并添加自定义的按钮来实现。例如: ```xml android:layout_width=...
这样,用户可以轻松地通过键盘本身的返回键来关闭键盘,而无需触摸屏幕其他地方。 另一个解决方法是“点击外部UIView时,隐藏软键盘”。这是通过监听用户触摸事件实现的。我们可以为视图添加一个手势识别器,如...
4、热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的框架支持。
然而,在某些情况下,我们可能希望在用户点击应用中的其他非EditText视图时自动隐藏键盘,以优化用户体验或保持屏幕清洁。标题"edittext失去焦点,收起键盘"以及描述"如果点击的view,不为edittext,则收起键盘"都...
虚拟软键盘对于触摸屏设备尤其有用,因为它允许用户在没有物理键盘的情况下输入文本。开发者可能使用了信号和槽机制,当用户在软键盘上点击按键时,相应的字符会传递到与之连接的输入框中。 在实际应用中,此项目...
方配触摸屏浏览器是一款...4、 热键(Shift+Esc)启动\取消全屏显示,自动适应屏幕分辨率。 5、本软件集成了浏览器的主页、前进、后退、停止、刷新等功能,使触摸屏网页浏览更加方便。 注:本软件运行需要.NET2.0的
在自定义键盘时,我们可能需要添加额外的按键,比如“确认”或“取消”按钮,以适应特定应用场景,如支付键盘。 **设计与布局** 1. **键盘格式**:设计时需考虑键盘的布局,是采用传统的横排还是更紧凑的竖排。横排...
在网页上实现虚拟键盘,主要是通过监听用户的鼠标或触摸事件,模拟真实的键盘输入,将用户的选择转化为字符并插入到指定的输入框中。这个过程涉及到DOM操作、事件处理和字符串处理等JavaScript核心概念。 "1-...
同时,用户可以通过滑动屏幕边缘或其他手势关闭键盘。 5. **自定义功能**:在某些应用中,可能需要自定义键盘的外观或功能,比如改变颜色主题、添加特殊符号等。这需要编程接口的支持。 在Android开发中,我们可以...
2. 触摸屏虚拟键盘:随着触摸屏技术的发展,大部分现代智能手机取消了物理键盘,转而采用虚拟键盘。用户在屏幕上滑动输入,节省了设备空间,提升了屏幕显示面积。 3. 智能键盘算法:现代虚拟键盘通过学习用户的输入...