场景一、点击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. apache重启操作

    方法: apahce启动命令: 推荐/apachectl start apaceh启动 apache停止命令 /apachectl stop   停止 apache重新启动命令: /apachectl ...

  2. 前端js模板库 JinkoTemplate

    有时候需要使用ajax来异步生成html,最土的方法就是用js的‘+’连接html代码,生成繁琐.一旦需要修改,对于少量的html代码到没啥问题,要是比较复杂的样式时,就真坑爹了,眼花缭乱有木有?Ji ...

  3. aix光盘安装包 aix puppet agent 自动化安装

    脚本待处理事务1,替换指定行数据2,获取$1 :字段分割 [Tips Notes,byRui]从光盘等安装媒介中isntallp -l -d /opt/ruiyhe or /dev/cd0 搜索所有的 ...

  4. #include <stdlib.h>

    1 _itoa 2 atoi 3 rand() 4 srand 1 _itoa _itoa(int value,char*string,int radix); int value 被转换的整数,cha ...

  5. 2016.09.01 html5兼容

    <!--[if lt IE 9]>  <script src="http://apps.bdimg.com/libs/html5shiv/3.7/html5shiv.min ...

  6. Zookeeper介绍

    Zookeeper是一个分布式的开源系统,目的是为分布式应用提供协调一致性服务. 分布式应用可以在Zookeeper提供的简单原语集之上构造更高层次的服务.比如统一命名服务.状态同步服务.集群管理.分 ...

  7. CodeForces 111B - Petya and Divisors 统计..想法题

    找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...

  8. 集合与lamdba

    List<, , , , }; List<)); /* foreach (int k in iList2) { Console.WriteLine(k.ToString()); } * * ...

  9. 网上B2C书城,1.0javaWEB版!!好几天没更新了,都忙着做那个网站了~

    惯例帮师傅打个广告www.java1234.com,从基础学习java WEB! 从最初的构思,到一点点功能的实现,真是不容易啊,由于自己没有项目经验,完全依靠自己的感觉,以及自己琢磨出来的思路来写, ...

  10. C# - 自定义 DataSet 的使用

    -------------------------------------------------  SellProdectManager.cs  -------------------------- ...