很奇怪,我在给EditText设置setOnFocusChangeListener()监听,但是始终未能成功,焦点一直存在,不知其原因,,代码如下:

     et_username.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
String tempName = et_username.getText().toString().trim();
if (!tempName.equals(userName) && tempName.length() > 0) {
// 发送新昵称
UIHelper.ToastMessage(getActivity(), "可以发送新昵称了。。。");
sendNewName(tempName);
} else {
et_username.setText(userName);
UIHelper.ToastMessage(getActivity(), "新昵称太短或无改变");
}
// 影藏软键盘
InputMethodManager imm = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
}
}
});

(PS:edittext会在界面生成是自动获取焦点,从而软键盘会自动被调出,如果对这一现象觉得体验性较差可在edittext生成后强行给他去掉焦点:edittext.clearFocus();)

先解决无法失去焦点的情况,再点击edittext的时候可以获得了焦点(这个测试过没有问题),但是点击其他地方的时候软键盘一直存在,光标依然在edittext中闪烁,设置的失去焦点的操作也没有执行,很奇怪,为什么可以得到焦点却失去不了焦点呢?伟大的度娘告诉我要这么干:

如果是Activity,可以直接时间ontachevent方法,在方法中写入

     @Override
public boolean onTouch(View v, MotionEvent event) { layout.setFocusable(true);
layout.setFocusableInTouchMode(true);
layout.requestFocus(); return super.getActivity().onTouchEvent(event);
}

这样就可以失去焦点,执行监听里失去焦点的操作了(原因尚未整明白。。。)

如果是Fragment ,可对最外围的布局设置OnTouchListener监听,实现onTouch方法,代码如上,一样。

再来解决影藏软键盘,这个比较简单,主要是上一步如何失去焦点。还是度娘,给fragment最外围布局设置了setOnTouchListener监听,达到了预期的效果,代码如下:

@Override
public boolean onTouch(View v, MotionEvent event) {
InputMethodManager imm = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
imm.hideSoftInputFromWindow(et_password.getWindowToken(), 0);
return true;
}

这里要解释下返回值true:

Android Developers上查看了一下这个接口和这个方法,文档中对该方法的返回值描述如下:True if the listener has consumed the event, false otherwise。大概意思就是说,如果返回true,则表示监听器消耗了该事件(我的理解就是不用继续向上传递该事件了,该事件的传递到此为止);否则返回false。首先触发到的监听是最底层最直接给它设置的监听,如果是false,并且它的父控件如果也注册次监听,那么它的父控件也会监听也会被触发 ;如果是true,则不会触发父控件的监听。

如果是Activity,直接重写onTouchEvent方法。代码如下:

     @Override
public boolean onTouchEvent(MotionEvent event) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
imm.hideSoftInputFromWindow(et_password.getWindowToken(), 0);
return super.onTouchEvent(event); }

很有用的一个关于进入activity后取消主动弹出软件盘的问题的参考:http://blog.sina.com.cn/s/blog_6dc41baf01015wqy.html

还有就是要注意edittext是否存在在ScrollView或ListView当中,如果存在ontach方法会交错混乱,还得另行处理。

EditText无法失去焦点、失去焦点隐藏软键盘的更多相关文章

  1. 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题

    如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹 ...

  2. Android开发,在Activity启动时,默认隐藏软键盘。和遮挡Edittext时的处理

    在Activity启动时,默认隐藏软键盘: 在AndroidManifest.xml中找到你得Activity ,为它添加属性: android:windowSoftInputMode="s ...

  3. Android点击空白处,隐藏软键盘

    在做登陆或者注册的时候,软键盘经常可能会挡住一些界面.我们需要在输入完成之后隐藏软键盘. 在我们点击空白处或者非EditText的地方来隐藏软键盘. public class HomeActivity ...

  4. android 开启或者隐藏软键盘

    一. 隐藏软键盘方法一(注:此方法本人使用时发现isActivie()失效,建议还是用其他方法..): InputMethodManager imm = (InputMethodManager)get ...

  5. Android中点击隐藏软键盘最佳方法——Android开发之路4

    Android中点击隐藏软键盘最佳方法 实现功能:点击EditText,软键盘出现并且不会隐藏,点击或者触摸EditText以外的其他任何区域,软键盘被隐藏: 1.重写dispatchTouchEve ...

  6. Android-----完全隐藏软键盘

    隐藏软键盘一直是我头痛的事情,没有找到一种真正能隐藏的方法.点击EditText的时候总是弹出软键盘.-----杯具 杯具(一): InputMethodManager im =(InputMetho ...

  7. iOS自动自动隐藏软键盘

    自动隐藏软键盘,分为两步,一个是单击软键盘外部任意空间:另外一个是单击软键盘上的return键.下面依次实现 单击软键盘外部空间键隐藏软键盘: 一:在viewDidLoad中添加一个UITabGest ...

  8. Android 隐藏软键盘

    隐藏软键盘 public void hideSoftInputView() { InputMethodManager manager = ((InputMethodManager) this.getS ...

  9. Android 调出和隐藏软键盘

    1.弹出软键盘 public static void showSoftInputMode(Context context,View windowToken) { final InputMethodMa ...

  10. Android隐藏软键盘

    1,用java代码隐藏: /**隐藏软键盘**/        View view = getWindow().peekDecorView();        if (view != null) { ...

随机推荐

  1. OpenAL

    http://blog.csdn.net/luckilyyu/article/details/6894707

  2. 万事开头难——Cocos2d-x学习历程(一)

    万事开头难,不知该从哪里开始,不过既然要学习一样新东西,那就从了解它开始吧... Cocos2d-x是一个通用平面游戏引擎,基于一个同样十分著名的游戏引擎Cocos2d-iPhone设计,Cocos2 ...

  3. Inno Setup打包的程序提升为管理员权限

    Inno Setup打包的程序在Win7 64位系统上安装,安装步骤最后一步若选中运行程序,会跳出一个错误提示框. 这是因为64位win7系统运行程序时需要管理员权限,而打包的文件并没有这个权限就试图 ...

  4. Lazy evaluation

    是一段源码,关于Lazy evaluation的,看了很久才懂,记录一下 一,lazy方法返回的比较复杂,一层一层将其剥开. wraps(func)跳转到curry(update_wrapper, f ...

  5. jsp中添加弹窗口并且实现向后台双向传递数据

    思路:使用jquery-easyui框架实现弹出div,在jsp初始化时从后台获得数据初始化div中的form表单元素的value属性,从而获得后台数据.在点击确定按钮时使用ajax向后台发送数据. ...

  6. 【转】vs2010下创建webservice

    题记:学了六个月java一直想做java,没想到进了.NET项目组,还是VB2012,还有WebService,压力山大,这篇纯粹看看多图的效果,版主不要怪罪. Visual Studio 2010默 ...

  7. 转发:使用sql命令查询视图中所有引用的基础表

    转自:使用sql命令查询视图中所有引用的基础表 使用sql命令查询视图中所有引用的基础表 之前有写过如何利用sql查询视图中所有引用的表发现这个方法并不能查出视图中所有的基础表,如果视图中有嵌套视图就 ...

  8. WIN ERROR:C:\Windows\System32\<LANG_NAME>\mstsc.exe.MUI

    Issue: When you upgrade Win7, you may found your remote desktop will not work. You may get following ...

  9. java学习之文件基本操作

    一.File类 文件的创建 package file; import java.io.File; import java.io.IOException; public class CreateFile ...

  10. action中实现对批量文件上传的封装

    如今,文件(尤其是图片)上传,在前后台的应用相当普遍,上传头像.共享资料等已成为最基本应用.我们很希望通过一个万能的封装方法来实现一劳永逸的效果. 接下来,就来为大家介绍具体实现. 首先,我们需要一个 ...