一、不自动弹出键盘:

带有EditText控件的在第一次显示的时候会自动获得focus,并弹出键盘,如果不想自动弹出键盘,有两种方法:

方法一:在mainfest文件中把对应的activity设置

android:windowSoftInputMode="stateHidden" 或者android:windowSoftInputMode="stateUnchanged"。

描述

"stateUnspecified"

软键盘的状态 (是否它是隐藏或可见 )没有被指定。系统将选择一个合适的状态或依赖于主题的设置。

这个是为了软件盘行为默认的设置。

"stateUnchanged"

软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。

"stateHidden"

当用户选择该 Activity时,软键盘被隐藏——也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个 Activity。

"stateAlwaysHidden"

软键盘总是被隐藏的,当该 Activity主窗口获取焦点时。

"stateVisible"

软键盘是可见的,当那个是正常合适的时 (当用户导航到 Activity主窗口时 )。

"stateAlwaysVisible"

当用户选择这个 Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个Activity。

"adjustUnspecified"

它不被指定是否该 Activity主 窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局 视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为 设置。

"adjustResize"

该 Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间

"adjustPan"

该 Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

这种方式编辑框还有光标。隐藏光标的方法:EditText.setCursorVisible(false)。

方法二:可以在布局中放一个隐藏的TextView,然后在onCreate的时候requsetFocus。

注意TextView不要设置Visiable=gone,否则会失效,可以在布局中放一个隐藏的TextView,然后在onCreate的时候requsetFocus。

<TextView

android:id="@+id/text_notuse"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:focusable="true"

  android:focusableInTouchMode="true"/>

  TextView textView = (TextView)findViewById(R.id.text_notuse);

textView.requestFocus();

二、手动显示和隐藏系统键盘

1、方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示)。此方法使用尚不确定,不好使。

  InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

  imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

2、方法二(view为接受软键盘输入的视图,SHOW_FORCED表示强制显示)

  InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

  imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);

  该方法在activity或者fragment的onCreate(或者onCreateView)函数中去调用,发现并不起作用,这是因为在onCreate中或者其他声明周期函数(onStart,onResume等)中,该EditText还未被绘制出来,InputMethodManager还不能获取到该控件的焦点,所以键盘并不会显示,而且manager.showSoftInput函数返回false,告诉你键盘并未显示。所以只有当EditText完全被绘制出来了,才可以去获取焦点。

解决方法:

edittext.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
      @Override  
      public void onGlobalLayout() {  
          InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE);  
          manager.showSoftInput(edittext, 0);  
      }  
});

注意:这个监听事件里最好不要放toggleSoftInput方法,不然键盘会不停闪烁。

 3、强制隐藏键盘  

  imm.hideSoftInputFromWindow(view.getWindowToken(), 0);

注意:如果第二个参数为HIDE_NOT_ALWAYS,那么当showSoftInput的第二个参数为SHOW_FORCED时,则隐藏不掉。

4、调用隐藏系统默认的输入法

  ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  (WidgetSearchActivity是当前的Activity)

5、获取输入法打开的状态

  InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

  boolean isOpen=imm.isActive();//isOpen若返回true,则表示输入法打开

6、InputMethodManager的常量:

    public static final int HIDE_IMPLICIT_ONLY

hideSoftInputFromWindow(IBinder, int)中的标志,表示如果用户未显式地显示软键盘窗口,则隐藏窗口。

  常量值: 1 (0x00000001)

    public static final int HIDE_NOT_ALWAYS

    hideSoftInputFromWindow(IBinder, int)中的标志,表示软键盘窗口总是隐藏,除非开始时以SHOW_FORCED显示。

    常量值: 2 (0x00000002)

    public static final int RESULT_HIDDEN

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口从显示切换到隐藏时的状态。

    常量值: 3 (0x00000003)

    public static final int RESULT_SHOWN

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口从隐藏切换到显示时的状态。

    常量值: 2 (0x00000002)

    public static final int RESULT_UNCHANGED_HIDDEN

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口不变保持隐藏时的状态。

    常量值: 1 (0x00000001)

    public static final int RESULT_UNCHANGED_SHOWN

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver结果代码标志:软键盘窗口不变保持显示时的状态。

    常量值: 0 (0x00000000)

    public static final int SHOW_FORCED

    showSoftInput(View, int)标志,表示用户强制打开输入法(如长按菜单键),一直保持打开直至只有显式关闭。

    常量值: 2 (0x00000002)

    public static final int SHOW_IMPLICIT

     showSoftInput(View, int)标志,表示隐式显示输入窗口,非用户直接要求。窗口可能不显示。

    常量值: 1 (0x00000001)

四、公共方法

    public void displayCompletions (View view, CompletionInfo[] completions)

    (译者注:输入法自动完成)

    public InputMethodSubtype getCurrentInputMethodSubtype ()

    (译者注:获取当前输入法类型?)

    public List<InputMethodInfo> getEnabledInputMethodList ()

    (译者注:获取已启用输入法列表?)

    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)

    public List<InputMethodInfo> getInputMethodList ()

    (译者注:获取输入法列表)

    public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes ()

    public void hideSoftInputFromInputMethod (IBinder token, int flags)

    关闭/隐藏输入法软键盘区域,用户不再看到或与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

    参数

    token       在输入法启动时提供令牌验证,验证后可对其进行操作。

    flags        提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLYHIDE_NOT_ALWAYS等位设置。

    public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)

     hideSoftInputFromWindow(IBinder, int, ResultReceiver)的无返回值版:从窗口上下文中确定当前接收输入的窗口,隐藏其输入法窗口

    参数

    windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)。

    flags        提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLY位设置。

    public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)

    从窗口上下文中确定当前接收输入的窗口,要求隐藏其软键盘窗口。它可由用户调用并得到结果而不仅仅是显式要求输入法窗口隐藏。

    参数

    windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)。

    flags        提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLY位设置。

        resultReceiver  如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWNRESULT_UNCHANGED_HIDDENRESULT_SHOWN,或RESULT_HIDDEN

    public void hideStatusIcon (IBinder imeToken)

    (译者注:隐藏状态栏图标?)

    public boolean isAcceptingText ()

    当前服务视图接受全文编辑返回真。没有输入法联接为false,这时其只能处理原始按键事件。

    public boolean isActive (View view)

    视图为当前输入的激活视图时返回真。

    public boolean isActive ()

    输入法中的任意视图激活时返回真。

    public boolean isFullscreenMode ()

    判断相关输入法是否以全屏模式运行。全屏时,完全覆盖你的UI时,返回真,否则返回假。

    public boolean isWatchingCursor (View view)

    如当前输入法要看到输入编辑者的光标位置时返回真。

    public void restartInput (View view)

    如有输入法联接至视图,重启输入以显示新的内容。可在以下情况时调用此方法:视图的文字导致输入法外观变化或有按键输入流,如应用程序调用TextView.setText()时。

    参数

    view        文字发生变化的视图。

    public void sendAppPrivateCommand (View view, String action, Bundle data)

    对当前输入法调用 InputMethodSession.appPrivateCommand()

  参数

    view         可选的发送命令的视图,如你要发送命令而不考虑视图附加到输入法,此项可以为空。

    action      执行的命令名称。必须是作用域的名称,如前缀包名称,这样不同的开发者就不会创建冲突的命令。

    data         命令中包含的任何数据。

    public boolean setCurrentInputMethodSubtype (InputMethodSubtype subtype)

    (译者注:此方法为3.0中新增的方法)

    public void setInputMethod (IBinder token, String id)

    强制切换到新输入法部件。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。

    参数

    token       在输入法启动时提供令牌验证,验证后可对其进行操作。

id              切换到新输入法的唯一标识。

    public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)

    强制切换到一个新的输入法和指定的类型。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。(译者注:此方法为3.0中新增的方法)

    参数

    token       在输入法启动时提供令牌验证,验证后可对其进行操作。

    id              切换到新输入法的唯一标识。

    subtype 切换到新输入法的新类型。

    public void showInputMethodAndSubtypeEnabler (String topId)

    (译者注:此方法为3.0中新增的方法)

    public void showInputMethodPicker ()

    (译者注:显示输入法菜单列表)

    public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)

    如需要,显式要求当前输入法的软键盘区域向用户显示。当用户与视图交互,用户表示要开始执行输入操作时,可以调用此方法。

  参数

    view         当前焦点视图,可接受软键盘输入。

    flags        提供额外的操作标志。当前可以是0或SHOW_IMPLICIT 位设置。

    resultReceiver         如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWNRESULT_UNCHANGED_HIDDEN,RESULT_SHOWN, 或 RESULT_HIDDEN 。

    public boolean showSoftInput (View view, int flags)

showSoftInput(View, int, ResultReceiver)的无返回值版:如需要,显式要求当前输入法的软键盘区域向用户显示。

  参数

    view         当前焦点视图,可接受软键盘输入。

    flags        提供额外的操作标志。当前可以是0或SHOW_IMPLICIT 位设置。

    public void showSoftInputFromInputMethod (IBinder token, int flags)

    显示输入法的软键盘区域,这样用户可以到看到输入法窗口并能与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

  参数

    token       在输入法启动时提供令牌验证,验证后可对其进行操作。

    flags        提供额外的操作标志。可以是0或 SHOW_IMPLICITSHOW_FORCED位设置。

    public void showStatusIcon (IBinder imeToken, String packageName, int iconId)

    (译者注:显示状态栏图标?)

    public boolean switchToLastInputMethod (IBinder imeToken)

    public void toggleSoftInput (int showFlags, int hideFlags)

    (译者注:切换软键盘)

    public void toggleSoftInputFromWindow (IBinder windowToken, int showFlags, int hideFlags)

    本方法切换输入法的窗口显示。如输入窗口已显示,它隐藏。如无输入窗口则显示。

  参数

    windowToken  由窗口请求View.getWindowToken()返回得到的令牌(token)。

    showFlags       提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLY位设置。

    hideFlags         提供额外的操作标志。可以是0或 HIDE_IMPLICIT_ONLYHIDE_NOT_ALWAYS位设置。

    public void updateCursor (View view, int left, int top, int right, int bottom)

    返回窗口的当前光标位置。

    public void updateExtractedText (View view, int token, ExtractedText text)

    (译者注:当内容变化时文本编辑器调用此方法,通知其新提取文本。)

    public void updateSelection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)

返回当前选择区域。

7、点击非输入框意外的区域时,收起键盘的方法。
考虑代码的复用性,以下代码均实现在基类BaseActivity中。
首先我们要重写dispatchTouchEvent()把操作放在用户点击的时候
/*** 点击空白区域隐藏键盘.*/@Overridepublic boolean dispatchTouchEvent(MotionEvent me) { if (me.getAction() == MotionEvent.ACTION_DOWN) { //把操作放在用户点击的时候 View v = getCurrentFocus(); //得到当前页面的焦点,ps:有输入框的页面焦点一般会被输入框占据 if (isShouldHideKeyboard(v, me)) { //判断用户点击的是否是输入框以外的区域 hideKeyboard(v.getWindowToken()); //收起键盘 } } return super.dispatchTouchEvent(ev); }

/*** 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏** @param v* @param event* @return */ private boolean isShouldHideKeyboard(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { //判断得到的焦点控件是否包含EditText int[] l = {0, 0}; v.getLocationInWindow(l); int left = l[0], //得到输入框在屏幕中上下左右的位置 top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { // 点击位置如果是EditText的区域,忽略它,不收起键盘。 return false; } else { return true; } } // 如果焦点不是EditText则忽略 return false; }

/*** 获取InputMethodManager,隐藏软键盘* @param token*/private void hideKeyboard(IBinder token) { if (token != null) { InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } }

鸣谢:
http://blog.csdn.net/h7870181/article/details/8332991
http://blog.csdn.net/pi9nc/article/details/9196779
http://blog.csdn.net/lxlmycsdnfree/article/details/60962731
https://www.jianshu.com/p/07963a45524b

转载于:https://www.cnblogs.com/qynprime/p/8330543.html

Android键盘显示和隐藏相关推荐

  1. 安卓运行时监听配置更改:sim卡、本地语言、键盘显示或隐藏、字体大小、UI模式、屏幕方向、屏幕布局(另一个屏幕)、可用屏幕大小(横纵向)、无屏幕大小(外接屏幕)。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓运行时可以监听的配置更改:sim卡.本地语言.键盘显示或隐藏.字体大小.UI模式.屏幕方向.屏幕布局(另一个屏幕).可用屏幕大小(横纵向).无屏幕 ...

  2. android 键盘 自动消失,android 键盘状态,获取键盘显示和隐藏

    要设置弹出键盘是否覆盖Activity的view,或者软键盘的显示隐藏状态,需要用到Activity的一个属性: android:windowSoftInputMode 该属性在AndroidMani ...

  3. android 软键盘显示和隐藏造成页面跳闪问题的解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 一.分析问题 1.为什么会闪? 首先图像切换主要用的无非就是ViewA.setVisibility(GONE) 和 ViewB ...

  4. Android 手动显示和隐藏软键盘

    本人用过第一个,第二个靠谱 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystem ...

  5. android inputmethodmanager 不自动弹出,Android中软键盘InputMethodManager的弹出和隐藏,以及显示和隐藏的监听...

    1.首先设置软键盘的弹出模式,设置在初始化View的前面 @Override protected void onCreate(Bundle savedInstanceState) { this.req ...

  6. android 键盘隐藏监听,Android监听键盘显示和隐藏

    问题概况:横板cocos2dx游戏,点击输入框弹出键盘时,界面要求跟随网上平易,不能挡住输入框.这种问题只出现在非全屏键盘到情况下. 方案1:mainActivity重写onconfiguration ...

  7. Android 软键盘显示隐藏判断

    Android软键盘始终感觉是个BUG,难缠 用起来不顺手,每次应用版本涉及到相关问题,总是很尴尬 只能静下心好好梳理一下 1. 软键盘显示原理 软键盘的本质是什么?软键盘其实是一个Dialog In ...

  8. android隐藏软键盘方法,Android使用InputMethodManager显示和隐藏软键盘

    Android主要用InputMethodManager来对软键盘进行管理.手动显示或隐藏软键盘前需要先获取InputMethodManager. InputMethodManager imm = ( ...

  9. android 键盘点击事件监听事件,Android 键盘事件触发以及监听

    一.Android 手动显示和隐藏软键盘 如果输入法在窗口上已经显示,则隐藏,反之则显示 InputMethodManager imm = (InputMethodManager) getSystem ...

最新文章

  1. 编写一个程序,实现将c语言源程序中的注释全部删除
  2. Matlab并行运算
  3. 我们来聊点成年人的话题!
  4. Oracle 11g 新特性 -- Invisible Indexes(不可见的索引) 说明
  5. 阶段3 2.Spring_08.面向切面编程 AOP_7 通用化切入点表达式
  6. CodeForces - 988D(思维STL)
  7. 线性分类器(Linear Classifier)
  8. 『常识』印刷纸张尺寸对比表
  9. nginx 日志问题(\x22)
  10. 网络爬虫——前程无忧网数据获取及MYSQL存储
  11. 详解TP-Link路由器设置(图解)
  12. 找到了!宝藏公众号合集,新媒体运营小白必须学习
  13. 对Carrier IQ木马的综合分析报告
  14. PAT考试一些注意事项
  15. Android Telephony
  16. 张驰杭州电子科技计算机学院,计算机学院举办“图灵教育计划”电子信息科学与技术专业交流会...
  17. 【C#】无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe)
  18. 2.深入浅出:晶体管共射极、共集电极、共基极接法的特点——参考《模拟电子技术基础》清华大学华成英主讲
  19. mysql row_number吗_MySQL中的ROW_NUMBER()是什么?
  20. ZTE/中兴N880e root教程_方法

热门文章

  1. 足迹APP简单开发实例
  2. TQ210裸机编程(3)——按键(查询法)
  3. POJ2083 ZOJ2423 Fractal
  4. C#:调用API实现简繁转换
  5. JavaSpringCloud-统一网关GateWay
  6. HR推荐的求职简历表-Word简历模板下载
  7. Android指纹识别,兼容Android 6.0 - Android 11
  8. 创客学院知识巩固-06系统移植部分小结
  9. [收集]什么是父表和子表
  10. 解决Win10热点卡顿或无网络