`
renyuan_1991
  • 浏览: 70593 次
  • 性别: 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
分享到:
评论

相关推荐

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

    在轻松访问中心中,用户会看到一个“启动屏幕键盘”的选项,点击它后,一个全新的屏幕键盘界面将出现在电脑屏幕上,用户即可通过鼠标或触摸板进行操作。 如果用户在使用完毕后想要关闭屏幕键盘,操作也非常简单。只...

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

    在Ubuntu操作系统中,Caribou是一款为触控设备设计的屏幕键盘软件,它会在用户进行输入操作时自动弹出,以方便触摸屏用户输入文本。然而,在某些情况下,用户可能不希望这个软键盘自动出现,比如在使用物理键盘或者...

    一个用Windows API写的屏幕键盘

    屏幕键盘是一种常见的辅助工具,尤其在无物理键盘的设备或特定场景下,如触摸屏设备、远程桌面连接等。这个程序是使用Windows API编写的,Windows API(Application Programming Interface)是微软为开发者提供的...

    win10怎么启动关闭触摸键盘.docx

    - 在“工具栏”选项卡中,取消勾选“触摸键盘”前面的复选框。 - 点击“确定”以关闭设置并保存更改。 2. **通过任务栏快速关闭**: - 同样,右键点击任务栏,然后将鼠标悬停在“工具栏”上。 - 点击已打开的...

    Win10系统内嵌触摸键盘功能开启或关闭方法.docx

    - 或者,您可以回到“任务栏设置”中,取消选中“触摸键盘”选项来禁用此功能。 触摸键盘提供了与实体键盘类似的输入体验,包括各种特殊字符、数字键盘以及快捷键。此外,触摸键盘还支持自定义布局和主题,以适应...

    关闭Windows 8触摸键盘模拟真实键盘敲击声.docx

    ### 如何关闭Windows 8触摸键盘的敲击声 随着技术的发展,触摸屏设备变得越来越普遍,尤其是在Windows 8及Windows 8.1系统中,为了更好地适应平板电脑等新型设备,微软引入了触摸键盘的功能。触摸键盘不仅方便了...

    Win8.1如何关闭或开启触摸键盘的声音.docx

    - 查找“在我输入内容时播放按键声音”的选项,并根据需要勾选或取消勾选该选项来开启或关闭触摸键盘的声音。 #### 备注与注意事项 - 本指南基于Windows 8.1预览版编写,正式版本的操作流程可能存在差异,请以...

    Win 8系统标准触摸键盘开启方法.docx

    对于习惯了使用物理键盘的用户而言,Windows 8系统的触摸键盘虽然提供了一定程度上的便捷,但在功能上仍然存在局限,特别是在精确操作和特定软件使用方面。本文将详细介绍Windows 8系统标准触摸键盘开启方法,以帮助...

    Android-keyboard-dismisser一个实现点击任何键盘外的部分来取消键盘的Android库

    该库的工作原理是监听触摸事件,并在检测到触摸发生在键盘之外时,调用InputMethodManager的hideSoftInputFromWindow方法来隐藏键盘。这样,用户无需寻找特定的关闭按钮,只需单击屏幕空白处即可完成操作,提高了...

    输入框中点击任何地方都可以取消输入键盘

    标题"输入框中点击任何地方都可以取消输入键盘"所涉及的知识点,主要是如何实现一个功能,使得用户在输入框中输入时,只需点击屏幕上的任意位置就能关闭软键盘,而不仅仅是点击输入框之外的地方。这种功能常见于各种...

    禁止软键盘弹出,自定义键盘

    -- 同样防止在触摸模式下获取焦点 --&gt; /&gt; ``` 然而,仅仅禁止软键盘还不够,我们还需要创建一个自定义键盘。自定义键盘可以通过创建一个布局文件并添加自定义的按钮来实现。例如: ```xml android:layout_width=...

    iOS 软键盘遮挡问题 点击外部隐藏软键盘

    这样,用户可以轻松地通过键盘本身的返回键来关闭键盘,而无需触摸屏幕其他地方。 另一个解决方法是“点击外部UIView时,隐藏软键盘”。这是通过监听用户触摸事件实现的。我们可以为视图添加一个手势识别器,如...

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

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

    edittext失去焦点,收起键盘

    然而,在某些情况下,我们可能希望在用户点击应用中的其他非EditText视图时自动隐藏键盘,以优化用户体验或保持屏幕清洁。标题"edittext失去焦点,收起键盘"以及描述"如果点击的view,不为edittext,则收起键盘"都...

    QT例子文件管理系统+软键盘

    虚拟软键盘对于触摸屏设备尤其有用,因为它允许用户在没有物理键盘的情况下输入文本。开发者可能使用了信号和槽机制,当用户在软键盘上点击按键时,相应的字符会传递到与之连接的输入框中。 在实际应用中,此项目...

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

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

    自定义手机数字键盘

    在自定义键盘时,我们可能需要添加额外的按键,比如“确认”或“取消”按钮,以适应特定应用场景,如支付键盘。 **设计与布局** 1. **键盘格式**:设计时需考虑键盘的布局,是采用传统的横排还是更紧凑的竖排。横排...

    js实现软键盘+小键盘

    在网页上实现虚拟键盘,主要是通过监听用户的鼠标或触摸事件,模拟真实的键盘输入,将用户的选择转化为字符并插入到指定的输入框中。这个过程涉及到DOM操作、事件处理和字符串处理等JavaScript核心概念。 "1-...

    九宫格键盘

    同时,用户可以通过滑动屏幕边缘或其他手势关闭键盘。 5. **自定义功能**:在某些应用中,可能需要自定义键盘的外观或功能,比如改变颜色主题、添加特殊符号等。这需要编程接口的支持。 在Android开发中,我们可以...

    电信设备-键盘及设置有键盘的智能移动终端.zip

    2. 触摸屏虚拟键盘:随着触摸屏技术的发展,大部分现代智能手机取消了物理键盘,转而采用虚拟键盘。用户在屏幕上滑动输入,节省了设备空间,提升了屏幕显示面积。 3. 智能键盘算法:现代虚拟键盘通过学习用户的输入...

Global site tag (gtag.js) - Google Analytics