软键盘显示的原理

  1. 软键盘的本质是什么?软键盘其实是一个Dialog!
  2. InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示。

(一) 软键盘的隐藏与出现

// view是需要控制的view对象

/**
     * 收起软键盘
     */
    public static void collapseSoftInputMethod(Context context, View v) {
        if (v != null) {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }
    }

/**
     * 显示软键盘
     */
    public static void showSoftInputMethod(Context context, View v) {
        if (v != null) {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(v, 0);
        }
    }

(二) 软键盘的各个属性值含义

活动的主窗口如何与包含屏幕上的软键盘窗口交互。这个属性的设置将会影响两件事情:

1>     软键盘的状态——是否它是隐藏或显示——当活动(Activity)成为用户关注的焦点。

2>     活动的主窗口调整——是否减少活动主窗口大小以便腾出空间放软键盘或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。

它的设置必须是下面列表中的一个值,或一个”state…”值加一个”adjust…”值的组合。在任一组设置多个值——多个”state…”values,例如&mdash有未定义的结果。各个值之间用|分开。例如: <activity android:windowSoftInputMode=”stateVisible|adjustResize” . . . >

在这设置的值(除”stateUnspecified”和”adjustUnspecified”以外)将覆盖在主题中设置的值

描述

“stateUnspecified”

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

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

“stateUnchanged”

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

“stateHidden”

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

“stateAlwaysHidden”

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

“stateVisible”

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

“stateAlwaysVisible”

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

“adjustUnspecified”

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

“adjustResize”

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

“adjustPan”

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

(三)软键盘与EditText交互

"EditText + Button"  形成一个 "输入+按键响应" 的案例在android编程中是最常见不过的了。

但还有一些细节需要注意:

  1. 在EditText输入后,点击Button进行请求,软键盘应该自行消失
  2. 在EditText输入后,不点击Button进行请求,而是直接点击软键盘上的"回车",那么也应该能够正常响应请求
针对问题1,可以在响应Button的onClick事件中,主动将软键盘隐藏,加入如下代码即可
[java]  view plain copy
  1. InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
  2. imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);

针对问题2,可以在EditText的api doc中找到答案

[plain]  view plain copy
  1. public void setOnEditorActionListener (TextView.OnEditorActionListener l)
  2. Set a special listener to be called when an action is performed on the text view. This will be called when the enter key is pressed, or when an action supplied to the IME is selected by the user. Setting this means that the normal hard key event will not insert a newline into the text view, even if it is multi-line; holding down the ALT modifier will, however, allow the user to insert a newline character.

因此,只需要给EditText设置一个onEditorActionListener就好了,简单示例如下

[java]  view plain copy
  1. mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
  2. @Override
  3. public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
  4. //TODO 这里做"回车"响应处理
  5. return true;
  6. }
  7. });

备注一下:TextView.OnEditorActionListener接口方法onEditorAction方法的第二个参数actionId,其可能的值在 EditorInfo的说明中能够找到。列举如下:

IME_ACTION_DONE
IME_ACTION_GO
IME_ACTION_NEXT
IME_ACTION_NONE
IME_ACTION_PREVIOUS
IME_ACTION_SEARCH
IME_ACTION_SEND
IME_ACTION_UNSPECIFIED

软键盘的Enter键默认显示的是“完成”文本,我们知道按Enter建表示前置工作已经准备完毕了,要去什么什么啦。比如,在一个搜索中,我们输入要搜索的文本,然后按Enter表示要去搜索了,但是默认的Enter键显示的是“完成”文本,看着不太合适,不符合搜索的语义,如果能显示“搜索”两个字或者显示一个表示搜索的图标多好。事实证明我们的想法是合理的,Android也为我们提供的这样的功能。通过设置android:imeOptions来改变默认的“完成”文本。这里举几个常用的常量值:

  1. actionUnspecified  未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED.效果:
  2. actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE 效果:
  3. actionGo 去往,对应常量EditorInfo.IME_ACTION_GO 效果:
  4. actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH 效果: 
  5. actionSend 发送,对应常量EditorInfo.IME_ACTION_SEND 效果:
  6. actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT 效果:
  7. actionDone 完成,对应常量EditorInfo.IME_ACTION_DONE 效果:

下面已搜索为例,演示一个实例,修改main.xml如下:

Xml代码  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <EditText
  8. android:id="@+id/edit_text"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:imeOptions="actionSearch"/>
  12. </LinearLayout>

修改HelloEditText如下:

Java代码  
  1. package com.flysnow;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.KeyEvent;
  5. import android.widget.EditText;
  6. import android.widget.TextView;
  7. import android.widget.Toast;
  8. import android.widget.TextView.OnEditorActionListener;
  9. public class HelloEditText extends Activity {
  10. /** Called when the activity is first created. */
  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. EditText editText=(EditText)findViewById(R.id.edit_text);
  16. editText.setOnEditorActionListener(new OnEditorActionListener() {
  17. @Override
  18. public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
  19. Toast.makeText(HelloEditText.this, String.valueOf(actionId), Toast.LENGTH_SHORT).show();
  20. return false;
  21. }
  22. });
  23. }
  24. }

运行程序,点击回车(也就是搜索图标软键盘按钮)会显示该actionId.我们上面的每一个设置都会对应一个常量,这里的actionId就是那个常量值。

android 虚拟键盘控制相关推荐

  1. android监控虚拟键盘,android虚拟键盘的监控,显示和隐藏

    android虚拟键盘的监控,显示和隐藏 听到一个键盘监控[显示.隐藏]的问题,上网找了下解决方案. 有提到使用onSizeChange方法监控的,也有监控onLayout方法的. 思路:在弹出键盘时 ...

  2. android华为手机虚拟键盘盖住底部,Android 虚拟键盘遮挡住页面问题我遇到的坑及个人解决办法...

    场景:某个页面多个组件.总体排版正好凑成满屏.一切按照UI给的标注效果图来.大部分机型测试通过.没有问题.华为手机有问题 兼容性:华为手机修改了虚拟键盘的位置.用户可以自由控制显示与隐藏虚拟键盘出现在 ...

  3. android 虚拟键盘的显示与隐藏问题

    焦点改变时如何隐藏虚拟键盘 在开发过程中碰到了一个需求:在点击搜索框后,再点击别的地方,让虚拟键盘隐藏 在焦点改变时,隐藏虚拟键盘.在 listView 中添加焦点监听.其中 mEditText 为所 ...

  4. Android 虚拟键盘相关功能大全

    移动开发跟虚拟键盘肯定要打交道,下来我们就说说常用的相关情况: 情况一.将键盘右下角的确认更改 android:imeOptions="actionDone" ,软键盘下方变成&q ...

  5. Android虚拟键盘的高度计算

    系统本身没有提供获取虚拟键盘的方法,在网上查了一些资料,发现还存在一点问题,故此把改好的代码记录下来,以备后用. 需要用OnGlobalLayoutListener来监听app窗口的变化 final ...

  6. android虚拟键盘InputMethodManager使用

    InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示. 在Activity中进行调整: AndroidManifet.xml中 ...

  7. android 虚拟键盘改变单个按键颜色_这款机械键盘很特别!一亿次按键寿命还有高颜值...

    电脑主机要上RGB,那外设自然不能落下,虽说没有60%性能加成,用炫酷的灯光点亮桌面的感觉也是不错的.德国老牌外设品牌--冰豹(ROCCAT)2018年发布了Vulcan系列机械键盘,凭借着独特的设计 ...

  8. Android虚拟键盘和虚拟触摸驱动

    1.虚拟键盘驱动 文件位置:kernel/drivers/input/keyboard/zebra_key.c #include <linux/module.h> #include < ...

  9. Android虚拟键盘遮挡EditText的解决方案

    在做项目的时候,遇到的问题,就是点击编辑框软键盘会把编辑框给遮挡住,于是网上查资料说只需要在注册文件里的当前Activity配置上: <activity android:windowSoftIn ...

最新文章

  1. 工作中常用,实用工具推荐!
  2. Rhel5.6下构建在线邮件服务系统并实现不同网段不同域名间的邮件互发
  3. 北京开源人linux运维实战
  4. linux pivot root,[mydocker]---通过例子理解chroot 和 pivot_root
  5. Liquid基础语法
  6. 交换机抑制广播命令详解
  7. SQL Server 2008 存储结构之DCM、BCM
  8. Layui 数据表格动态cols(字段)动态变化
  9. 像素值、物理尺寸、分辨率三者关系
  10. 带宽和下载速度的关系
  11. 完美解决Java IO流读取中文文本文件乱码问题
  12. Spring 事务源码(6)—createTransactionIfNecessary处理事务属性并尝试创建事务【两万字】
  13. 微信小程序显示空格符
  14. [解决方案] LaTeX公式中的多行大括号 (如涵盖多个不等式)
  15. 报错:Exception in thread “main“ java.io.IOException: 设备未就绪。
  16. counter-reset
  17. 道通转债,微芯转债,博22转债上市价格预测
  18. 抖音表情制作方法 动态GIF怎么玩
  19. CF1492A - Three swimmers
  20. 一键脚本升级OpenSSL、OpenSSH

热门文章

  1. 最大公约数gcd函数简介
  2. visual studio 2010卸载
  3. John介绍及常用命令使用说明
  4. 网络安全学习笔记(一)
  5. 模拟RGB转CVBS/S-video,VGA转CVBS(AV)/S-video,MS1835
  6. android editable接口,Spannable与Editable区别
  7. hmcl离线登陆_hmcl启动器下载
  8. 火绒剑(专业人员使用的系统进程分析工具)
  9. django2.0调用银联支付接口实现银联支付
  10. 2068. 整数拼接