场景一、点击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. printdir-deldir-bmp

    #include<unistd.h> #include<stdio.h> #include<dirent.h> #include<string.h> # ...

  2. 收敛 p75

    三种收敛.中心极限定理.大数定理.delta方法

  3. 畅通工程续(dijskra+SPFA)

    畅通工程续 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  4. MySQL 查询结果以百分比显示

    找了一些资料,然后我是用到了MySQL字符串处理中的两个函数concat()和left()1.[CONCAT(str1,str2,...)  返回来自于参数连结的字符串.如果任何参数是 NULL, 返 ...

  5. AutoResetEvent和ManualResetEvent

    本文在于巩固基础 AutoResetEvent 概念:通知正在等待的线程已发生的事件 如果AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资 ...

  6. Android开发问题汇总(持续更新)

    在Android开发中,总会有一些很小的问题.由于我们的不仔细,很容易忽略掉,从而导致在该问题上花费了很多的时间,造成工作进度的延迟. 为此,在这里做一下记录,避免再次浪费许多时间在这些问题上. 1. ...

  7. SPRING 配置文件和类名

    今天写项目碰到一个很奇怪的问题,无论怎么改,还是一直包空指针 最终的问题出现在spring配置文件

  8. c++中类模版中的static数据成员的定义

    这个有点绕. 如下: template <typename T> class A{ ......... static std::allocate<T> alloc_; }; t ...

  9. Python核心编程读笔 12:OOP

    第13章 面向对象编程 一.基本概念 1.object类是所有类的基类,如果你的类没有继承任何其他父类,object 将作为默认的父类. 2.python创建实例时无需new: myFirstObje ...

  10. lightoj 1064 Throwing Dice

    题意:给你n个骰子,求n个骰子的和不小于x的概率. 刚开始想每给一组数就计算一次~~太笨了- -,看了别人的代码,用dp,而且是一次就初始化完成,每次取对应的数据就行了.WA了好多次啊,首先不明白的就 ...