EditText 无法失焦与失焦后键盘不收缩解决方案
背景
有一个需求,比方说下图:

点击了上图的Image 区域才可以编辑。
那么我首先想到的就是:
android:focusable="false"不让它获取到焦点不就ok吗?
事实上这是很好的方式,然后我开始编辑点击图片后EditText获取焦点:
editText.setSelection(editText.getText().length());//设置焦点位置移到最后,如果没有这一句,那么焦点将会在最前
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();// 请求焦点ps:
editText.setFocusable(true); //物理按键可获得焦点,一般智能电视机,我们的遥控操作之类
editText.setFocusableInTouchMode(true); ////触摸可获得焦点上述如果有一个不为true,android系统都会认为不能获取焦点。
出现了一个小小的问题,拥有焦点后,居然没有弹出软键盘。这时候开发者主动点,把它盘出来。
InputMethodManager  inputManager=(InputMethodManager)getBaseContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText,InputMethodManager.SHOW_FORCED);这样似乎ok了的。
那么糟糕的情况来了,当我点击EditText的以外的地方的时候,焦点还在Edit上面,焦点并没有消失。
解决方案
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            View edittext=findViewById(R.id.edittext);
            //判断是否被点击
            if (!isTouchPointInView(edittext,(int) ev.getX(),(int) ev.getY()))
            {
               edittext.clearFocus();
            }
            break;
    }
    return super.dispatchTouchEvent(ev);
}我通过判断如果不在触摸区域内,就让它失去焦点。
按照这个想法,我的确成功了,然而凡事哪有一帆风顺,我遭遇到了另外一个bug。那就是,焦点失去了,然而软键盘还在。
这时候我想到了焦点变动事件,code 如下:
findViewById(R.id.edittext).setOnFocusChangeListener(new View.OnFocusChangeListener(){
    @Override
    public  void onFocusChange(View v,boolean hasFocus)
    {
        EditText editText=(EditText)v;
        if (!hasFocus)
        {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
        }
    }
});是的,失去了焦点那么就让软键盘消失。
其他需要注意的
其他问题,比如页面back了,或者退出了app,我们都需要手动去让软键盘隐藏,事件分别是@Override的:onStop与onBackPressed。
EditText 无法失焦与失焦后键盘不收缩解决方案的更多相关文章
- EditText: EditText自动获取焦点并弹出键盘&EditText不自动获取焦点并且不会弹出键盘
		1.EditText不自动获取焦点并且不会弹出键盘 找到EditText的父控件,设置其父控件为: Parent.setFocusable(true); Parent.setFocusableInTo ... 
- (原)android的alertdialog中加入edittext但是不弹出软键盘等问题的解决与原因
		摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案, 本文意在给出更有效的解决办法,并初步探究其原因 正文 在对话框中插入文本框是十分常见的需求 通常我 ... 
- 在android中如何通过点击edittext之外的部分使软键盘隐藏
		我们知道在android中点击edittext框就会自动弹出软键盘,那怎么通过点击edittext之外的部分使软键盘隐藏呢?(微信聊天时的输入框就是这个效果,这个给用户的体验还是很不错的) 首先我们要 ... 
- EditText默认不弹出软键盘
		#EditText默认不弹出软键盘# 网上关于EditText默认情况下不弹出软键盘,当手触摸到EditText,获取焦点时候,才会弹出软键盘,貌似都不能用,其实,在oncreate()方法中,加上 ... 
- EditText 默认不获取焦点,弹出软键盘布局变形解决方案
		关于弹出软键盘布局变形解决方案: 在androidMainfest.xml文件中在此Activity中写入 android:windowSoftInputMode="adjustPan&qu ... 
- 关于Android中EditText自动获取焦点并弹出键盘的相关设置
		在android开发中,关于EditText自动获取焦点弹出键盘,我们可能又是会有让键盘自动弹出的需求,有时可能又会有不想让键盘自动弹出的需求,下面是我所总结的两种方法: 需求:EditText自动获 ... 
- (转载) EditText初始不弹出软键盘,只有光标显示,点击再弹出
		EditText初始不弹出软键盘,只有光标显示,点击再弹出 2013-06-08 10:13 21305人阅读 评论(5) 收藏 举报 分类: android基础(91) 版权声明:本文为博主原创 ... 
- 转 Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案
		今早刚上班.客户打电话过来说系统访问不了,输入用户名.用户号不能加载出来!听到这个问题,第一时间想到的是不是服务器重新启动了,Oracle数据库的相关服务没有启动的原因.查看服务的时候,发现相关的服务 ... 
- g++编译后中文显示乱码解决方案(c++)
		g++编译后中文显示乱码解决方案 环境:Windows 10 专业版 GCC版本:5.3.0 测试代码: 1 #include <iostream> 2 using namespace ... 
随机推荐
- [转载]1.4 UiPath参数的介绍和使用
			一.参数介绍 用于将数据从一个项目传递到另一个项目.在全局意义上,它们类似于变量,因为它们动态地存储数据并传递给它.变量在活动之间传递数据,而参数在自动化之间传递数据.因此,它们使你能够一次又一次地重 ... 
- 源码学习系列之SpringBoot自动配置(篇二)
			源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ... 
- Win7安装pyenchant
			pip3 install pyenchant==1.6.6 单纯的 pip3 install pyenchant报错 
- Kubernetes概述
			1. Kubernetes是什么 Kubernetes是一个可移植的.可扩展的.用于管理容器化工作负载和服务的开源平台,它简化(促进)了声明式配置和自动化.它有一个庞大的.快速增长的生态系统.Kube ... 
- PHP Swoole-Demo TCP服务端简单实现
			tcp 服务端简单demo与client . <?php /** * author : rookiejin <mrjnamei@gmail.com> * createTime : 2 ... 
- 【实战】如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列)
			一.开发环境的搭建 (1)apache+php+mysql环境搭建 因为要用apache来做服务器,mysql作为数据库来存储数据,php来写代码以此实现网页与数据库的交互数据,所以需要下载上述软件, ... 
- 破解加密Excel
			打开要解除保护的EXCEL ALT+F11----插入模块----复制粘贴代码----F5============================代码========================= ... 
- pat 1108 Finding Average(20 分)
			1108 Finding Average(20 分) The basic task is simple: given N real numbers, you are supposed to calcu ... 
- 理解Spark SQL(二)—— SQLContext和HiveContext
			使用Spark SQL,除了使用之前介绍的方法,实际上还可以使用SQLContext或者HiveContext通过编程的方式实现.前者支持SQL语法解析器(SQL-92语法),后者支持SQL语法解析器 ... 
- Centos7下oracle12c的安装与配置(详细)
			一.硬件配置 CentOS7@VMware® Workstation 15 Pro,分配资源:CPU:2颗,内存:4GB,硬盘空间:30GB 二.软件准备 linux.x64_11gR2_datab ... 
