android 虚拟键盘控制
软键盘显示的原理
- 软键盘的本质是什么?软键盘其实是一个Dialog!
- 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编程中是最常见不过的了。
但还有一些细节需要注意:
- 在EditText输入后,点击Button进行请求,软键盘应该自行消失
- 在EditText输入后,不点击Button进行请求,而是直接点击软键盘上的"回车",那么也应该能够正常响应请求
- InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
针对问题2,可以在EditText的api doc中找到答案
- public void setOnEditorActionListener (TextView.OnEditorActionListener l)
- 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就好了,简单示例如下
- mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- //TODO 这里做"回车"响应处理
- return true;
- }
- });
备注一下: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来改变默认的“完成”文本。这里举几个常用的常量值:
- actionUnspecified 未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED.效果:

- actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE 效果:

- actionGo 去往,对应常量EditorInfo.IME_ACTION_GO 效果:

- actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH 效果:

- actionSend 发送,对应常量EditorInfo.IME_ACTION_SEND 效果:

- actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT 效果:

- actionDone 完成,对应常量EditorInfo.IME_ACTION_DONE 效果:

下面已搜索为例,演示一个实例,修改main.xml如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <EditText
- android:id="@+id/edit_text"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:imeOptions="actionSearch"/>
- </LinearLayout>
修改HelloEditText如下:
- package com.flysnow;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.KeyEvent;
- import android.widget.EditText;
- import android.widget.TextView;
- import android.widget.Toast;
- import android.widget.TextView.OnEditorActionListener;
- public class HelloEditText extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- EditText editText=(EditText)findViewById(R.id.edit_text);
- editText.setOnEditorActionListener(new OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- Toast.makeText(HelloEditText.this, String.valueOf(actionId), Toast.LENGTH_SHORT).show();
- return false;
- }
- });
- }
- }
运行程序,点击回车(也就是搜索图标软键盘按钮)会显示该actionId.我们上面的每一个设置都会对应一个常量,这里的actionId就是那个常量值。
android 虚拟键盘控制的更多相关文章
- 〖Android〗简单隐藏Android虚拟键盘的方法
在Android使用 input 输入文本时,不期望出现虚拟键盘: 一般情况下,大家会把键盘给卸载,不过也有简单的方法: 就是下载一个 com.wparam.nullkeyboard (NullKey ...
- Android虚拟键盘弹出时挡住EditText解决方法
在manifest的activity节点使用 Xml代码 <activity android:windowSoftInputMode="adjustResize"/> ...
- Android 虚拟键盘弹出把底部栏顶上去的解决办法
在AndroidManifest中使用ActivityGroup的activity中加上:android:windowSoftInputMode="adjustPan"
- Android适配底部返回键等虚拟键盘的完美解决方案
这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...
- Android 适配底部返回键等虚拟键盘的完美解决方案
这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...
- Android开发案例 - 自定义虚拟键盘
所有包含IM功能的App(如微信, 微博, QQ, 支付宝等)都提供了Emoji表情之类的虚拟键盘, 如下图: 本文只着重介绍如何实现输入法键盘和自定义虚拟键盘的流畅切换, 而不介绍如何实现虚 ...
- 关于Android 打开新的Activity 虚拟键盘的弹出与不弹出
关于Android 打开新的Activity 虚拟键盘的弹出与不弹出 打开Activity 时 在相应的情况 弹出虚拟键盘 或者 隐藏虚拟键盘 会给用户非常好的用户体验 , 实现起来也比较简单 只需 ...
- 在 Android 的文字编辑控件 (TEdit) 中, 如何按下 Enter 就隐藏虚拟键盘
在 Windows 的应用中,我们常常为了让使用者能够快速输入,在Edit元件中的onKeyUp或者 onKeyDown 事件中主动侦测使用者输入的字元是否有换行符号 (Enter),当使用者按下了E ...
- Android: View换切后,无法正常设置焦点或切换后TextView的虚拟键盘不弹出
边学.边测试,花了三天时间完工一个小应用. 遇到很多问题,但最终还是解决了. 我的手机是Android2.2版,所以我也在是2.2版环境下学习,开发. 1. 在同一个Activity中的不同View( ...
随机推荐
- 设置Adobe Reader打开PDF文件保持记忆功能
设置Adobe Reader打开PDF文件保持记忆功能 打开菜单“编辑”->“首选项”. 选择种类中的“文档”,在“打开设置”区域勾上“重新打开文档时恢复上次视图设置(R)”,确定之后就可以在下 ...
- Google Guice之作用域
默认情况下,Guice获取一个实例时.每次都会返回一个新的对象. 这个行为能够通过scopes进行配置.Scopes同意你复用实例: 应用整个生命周期(@Singleton),会话(@Session) ...
- Spark Core Runtime分析: DAGScheduler, TaskScheduler, SchedulerBackend
Spark Runtime里的主要层次分析,梳理Runtime组件和运行流程, DAGScheduler Job=多个stage,Stage=多个同种task, Task分为ShuffleMapTas ...
- EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"
解决方案代码一:使用lock锁定 //对于锁推荐使用静态私有静态变量 private readonly static object _MyLock = new object(); /// <su ...
- 客户端负载均衡:Ribbon
Ribbon是一个客户端的负载均衡器,可以提供很多HTTP和TCP的控制行为.Feign已经使用了Ribbon,所以如果你使用了@FeignClient,Riboon也同样被应用了. Ribbon核心 ...
- Oracle学习笔记之五sp1,PL/SQL之BULK COLLECT
Bulk Collect特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率. BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQ ...
- jQuery.ajax() 如何设置 Headers 中的 Accept 内容
其实很简单,首先如果是常见类型,则请直接设置 dataType 属性 $.ajax({ dataType: "json", type: "get", succe ...
- 关于modelsim时序仿真的几篇文章
1.http://wenku.baidu.com/view/386597f37c1cfad6195fa797.html 2.http://wenku.baidu.com/view/4b9521f9f7 ...
- JMeter学习笔记(五)-总结
本周主要学习了JMeter如下几方面内容: (1)Bdboy录制方式: (2)JMeter的代理录制方式: (3)关联,在关联时我们要找到哪些内容是要关联的,这个主要通过分析哪些内容是由服务器返回的, ...
- html 中 input 控制输入百分比数值范围(0.0-100)
通过正则表达式在HTML的input中控制百分数的输入值(0.0-100),并且控制小数点的输入位置和个数 方案一: <input type="text" id=percen ...