场景一、点击EditText之外的空白区域隐藏键盘:

how to hide soft keyboard on android after clicking outside EditText?

首先定义一个关闭键盘的方法:

    /**
* 关闭软键盘
*/
public static void closeSoftKeyboard(Context context) {
InputMethodManager inputMethodManager = (InputMethodManager)context
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null && ((Activity)context).getCurrentFocus() != null) {
inputMethodManager.hideSoftInputFromWindow(((Activity)context).getCurrentFocus()
.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}

如果用户选择或者点击了输入框以外的区域怎么隐藏掉已经弹出的键盘呢?需要遍历Activity中每个View并检查它是否是EditText的实例,如果不是就注册一个setOnTouchListener,只要点击了该View就会触发它的OnTouch方法,从而在里面隐藏键盘。但实际有更简单的方法可以处理View和ViewGroup,那就是利用下面的递归方法,这个方法其实用处很多,还可以同来设置自定义字体。

public void setupUI(View view) {

    //Set up touch listener for non-text box views to hide keyboard.
if(!(view instanceof EditText)) { view.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(MyActivity.this);
return false;
} });
} //If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setupUI(innerView);
}
}
}

这样在Activity的setContentViewi之后就能调用上面的setupUI方法了,其中的参数View是Activity的布局的rootView。为Activity的根布局指定一个id就可以了 。

如果想有效的使用该方法,可以把上面的方法放到BaseActivity中,继承它的Activity在onCreate()中调用setupUI就可以了。

场景二、进入带有EditText的Activity时隐藏键盘

这时候一般EditText会获取自动获取焦点然后弹出键盘。进入页面时不自动弹出的话可以:

在EditText的外层layout上设置:

android:focusable="true"

android:focusableInTouchMode="true"

或者强制隐藏Android输入法窗口
例如:  EditText edit=(EditText)findViewById(R.id.edit);  
           InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
           imm.hideSoftInputFromWindow(edit.getWindowToken(),0);

注意:在AndroidMainfest.xml中设置使用EditText的activity的属性,设置windowSoftInputMode属性为adjustUnspecified|stateHidden

场景三、进入带有EditText的Activity时自动弹出键盘

        inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 自动展开键盘
inputMethodManager.showSoftInput(etUsername, WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

有时候界面还没有完全绘制成功,(这个用Activity的几个生命周期函数是无法判断的,不过可以用onWindowFocusChanged,这个回调函数调用时页面已经加载完毕了),可以适当延迟一定的时间再弹出,比如像下面这样延迟300ms:

    private void initView() {
btnLogin.setOnClickListener(this);
tvForgetPassword.setOnClickListener(this);
inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 自动展开键盘
autoShowKayboard();
} private void autoShowKayboard() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// 自动展开键盘
inputMethodManager.showSoftInput(etUsername, WindowManager.LayoutParams
.SOFT_INPUT_STATE_VISIBLE);
}
}, 300);
}

Android基础-EditText键盘的显示与隐藏的更多相关文章

  1. EditText获取和失去焦点,软键盘的关闭,和软键盘的显示和隐藏的监听

    软键盘显示和隐藏的监听: 注: mReplayRelativeLayout是EditText的父布局 //监听软键盘是否显示或隐藏 mReplayRelativeLayout.getViewTreeO ...

  2. Android 软键盘的显示和隐藏,这样操作就对了

    一.前言 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求.开篇明义,本文会讲讲弹出和收起软键盘的一些细节,最终还会从源码进行分析. 想要操作软键盘,需要使用到 InputMetho ...

  3. android 软键盘的显示与隐藏问题的研究

    在android中,常常会和输入法的软件键盘交互.在Manifest文件中,系统给activity的一个属性-windowSoftInputMode来控制输入法的显示方式. 该属性提供了Activit ...

  4. Android ActionBar详解(一)--->显示和隐藏ActionBar

    MainActivity如下: package cc.testsimpleactionbar0; import android.os.Bundle; import android.view.View; ...

  5. 日积月累:EditText软键盘的显示和隐藏

    在工作过程中,常常会遇见需要根据自己的需求,控制文本框的键盘显示和隐藏. 通过查阅Android文档,介绍可以通过在清单文件中<activity>元素中添加android:windowSo ...

  6. Android开发UI之手动显示和隐藏软键盘

    1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...

  7. 如何控制android系统中NavigationBar 的显示与隐藏

    我们使用的大多数android手机上的Home键,返回键以及menu键都是实体触摸感应按键.如果你用Google的Nexus4或Nexus5话,你会发现它们并没有实体按键或触摸感应按键,取而代之的是在 ...

  8. android软键盘的显示和隐藏

    显示: InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.toggle ...

  9. Android 判断软键盘弹出并隐藏的简单完美解决方案

    最近项目中有一个编辑框,下面是个ListView.在触发编辑框弹出软键盘后,ListView还能滑动,并且ListView的item还能响应单击.这样的体验效果很不好.于是便想在滑动或单击item时判 ...

随机推荐

  1. localStorage点击次数存储

    <!DOCTYPE html><html><head><meta charset="utf-8"> <title>菜鸟教 ...

  2. 分布式拒绝服务攻击(DDoS)原理及防范【转】

    DDoS攻击概念 DoS的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应. DDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击 ...

  3. 利用PowerDesigner15在win7系统下对MySQL 进行反向project(二)

    利用PowerDesigner15在win7系统下对MySQL 进行反向project 1.打开PowerDesigner,建立新模型.选择Physical Data Model中的Physical ...

  4. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  5. CodeFirst EF中导航属性的个人理解

    >导航属性: 01.个人理解就是Ef中的属性在实体数据表中不存在(先这么认为); 02.就是除了根据表中列映射出的属性 之外根据表与表之间的关系的关联属性.方便操作与之关联的表; 例如: 有 表 ...

  6. for应用

    应用:迭代法,穷举法.一.迭代法:有一定规律. 每次循环都是从上次运算结果中获得数据,本次运算的结果都是要为下次运算做准备.例:1.100以内所有数的和.2.求阶乘3.求年龄.4.折纸.5.棋盘放粮食 ...

  7. CentOS6.3下搭建vsftpd(采用虚拟用户设置)

    CentOS6.3如果在安装的时候所有安装选项都打勾的话就含有单间vsftpd必备的软件:vsftpd.pam*.db4* 检查是否安装: [root@centos6 ~]# rpm -qa | gr ...

  8. iOS常用的封装方法

    做开发也有一段时间了,看了好多大神的代码,总体感觉他们写的代码简洁,好看,然而在对比下我写的代码,混乱,无序,简直不堪入目啊! 总体来说大神们的代码封装的都比较好,对一个项目要重复用到的代码他们都会封 ...

  9. C#用网易邮箱发送邮件(同步异步)

    SmtpClient smtpServer = new SmtpClient("smtp.163.com"); smtpServer.Port = ; smtpServer.Cre ...

  10. Linux 学习之防火墙配置

    1.安装iptables防火墙 yum install iptables  2. 清除已有的iptables规则  iptables -F  iptables -X  iptables -Z  3.显 ...