这章记录下Android软键盘的使用
在EditText中指定android:inputType,比如指定为password,即为密码,会不可见明文。
看一下可以指定的输入类型:
常量(xml中使用) | 代码中设置值 | 描述 |
---|---|---|
date | TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE | 日期 |
datetime | TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE | 日期(含时间) |
none | 没有类型,不可编辑 | |
number | TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_NORMAL | 数字 |
numberDecimal | TYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_DECIMAL | 小数 |
numberPassword | TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD | 数字密码 |
numberSigned | TYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_SIGNED | 有符号数字 |
phone | TYPE_CLASS_PHONE | 手机号 |
text | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL | 文本 |
textAutoComplete | TYPE_TEXT_AUTO_COMPLETE | 自动完成文本 |
textAutoCorrect | TYPE_TEXT_FLAG_AUTO_CORRECT | 纠正单词拼写错误 |
textCapCharacters | TYPE_TEXT_FLAG_CAP_CHARACTERS | 普通字符 |
textCapSentences | TYPE_TEXT_FLAG_CAP_SENTENCES | 句子首字母大写 |
textCapWords | TYPE_TEXT_FLAG_CAP_WORDS | 单词首字母大写 |
textEmailAddress | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_ADDRESS | email地址 |
textEmailSubject | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_SUBJECT | 邮件主题 |
textFilter | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_FILTER | 文本筛选 |
textImeMultiLine | TYPE_TEXT_FLAG_IME_MULTI_LINE | 输入法多行 |
textLongMessage | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_LONG_MESSAGE | 长消息 |
textMultiLine | TYPE_TEXT_FLAG_MULTI_LINE | 多行文本 |
textNoSuggestions | TYPE_TEXT_FLAG_NO_SUGGESTIONS | 不提示 |
textPassword | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD | 密码 |
textPersonName | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PERSON_NAME | 人名 |
textPhonetic | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PHONETIC | 拼音 |
textPostalAddress | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_POSTAL_ADDRESS | 邮政 |
textShortMessage | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_SHORT_MESSAGE | 短消息 |
textUri | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_URI | 文本作为URI |
textVisiblePassword | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | 可见密码 |
textWebEditText | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EDIT_TEXT | 网页表单文本 |
textWebEmailAddress | YPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS | 表单上emial地址 |
textWebPassword | TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_PASSWORD | 表单上密码 |
time | TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME | 时间 |
按需设置。比如像拼写检查,首字母大写,可以设置android:inputType=”textCapSentences|textAutoCorrect”
android:imeOptions可以用于指定输入法上的操作,比如完成、下一项等操作。然后再代码中可以指定处理方法:
Editext editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent e) {
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_SEND) {
sendMessage();
handled = true;
}
return handled;
}
});
具体的操作如下表所示。
xml中值 | 对应代码中类型 | 对应操作 |
---|---|---|
actionDone | IME_ACTION_DONE | 完成 |
actionGo | IME_ACTION_GO | 前往 |
actionNext | IME_ACTION_NEXT | 下一项 |
actionNone | IME_ACTION_NONE | 没有操作关联 |
actionPrevious | IME_ACTION_PREVIOUS | 前一项 |
actionSearch | IME_ACTION_SEARCH | 查找 |
actionSend | IME_ACTION_SEND | 发送 |
actionUnspecified | IME_NULL | 没有关联操作,如果编辑可以就自己设定 |
normal | 没有与此编辑器相关联的语义 |
还有几个不常用就不写了,而且也不太理解到底是干嘛用的
可以通过调用setAdapter()方法来设置其提示的文本内容,以便点击自动输入。例子就不写了。
1)在activity启动时显示输入法
...>
"stateVisible" .../> // 有外接键盘时不会显示
2)在需要时显示
public void showSoftKeyboard(View view) {
if (view.requestFocus()) {
InputMethodManager mm = (InputMethodManager) getSystemService(Contex.INPUT_METHOD_SERVICE);
mm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}
3)指定UI响应方式
输入法出现时会减少UI的可用空间,可以指定系统对UI的调整方式来达到最佳体验。比如登录按钮在底部,正常情况下,会在显示键盘时就隐藏住了,想登陆只能隐藏键盘再点击。此时可以在清单activity元素中指定android:windowSoftInputMode=”adjustResize”。其他相关值如下表所示,在指定时,必须是下表中的一个,或是一个”state…”加一个”adjust…”组合,用竖线(|)分隔。
值 | 说明 |
---|---|
stateUnspecified | 不指定软键盘的状态(隐藏还是可见)。 将由系统选择合适的状态,或依赖主题中的设置。软键盘行为的默认设置 |
stateUnchanged | 当 Activity 转至前台时保留软键盘最后所处的任何状态,无论是可见还是隐藏 |
stateHidden | 当用户选择 Activity 时,即向前导航到 Activity,而不是因离开另一Activity而返回时,隐藏软键盘 |
stateAlwaysHidden | 当 Activity 的主窗口有输入焦点时始终隐藏软键盘 |
stateVisible | 在正常的适宜情况下(当用户向前导航到 Activity 的主窗口时)显示软键盘 |
stateAlwaysVisible | 与上面的stateHidden一致,不过是显示软键盘 |
adjustUnspecified | 不指定 Activity 的主窗口是否调整尺寸以为软键盘腾出空间,或者窗口内容是否进行平移以在屏幕上显露当前焦点。 系统会根据窗口的内容是否存在任何可滚动其内容的布局视图来自动选择其中一种模式。 如果存在这样的视图,窗口将进行尺寸调整,前提是可通过滚动在较小区域内看到窗口的所有内容。这是对主窗口行为的默认设置 |
adjustResize | 始终调整 Activity 主窗口的尺寸来为屏幕上的软键盘腾出空间 |
adjustPan | 不调整 Activity 主窗口的尺寸来为软键盘腾出空间, 而是自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。 这通常不如尺寸调正可取,因为用户可能需要关闭软键盘以到达被遮盖的窗口部分或与这些部分进行交互 |
当使用键盘上的tab,下一项,上一项按钮,系统会默认按照其在布局中显示的顺序将元素间的输入焦点传递出去。但是如果屏幕上的顺序与文件中的顺序不同,比如相对布局中,则需要手动指定焦点顺序。
例如:
<RelativeLayout ...>
<Button
android:id="@+id/button1"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:nextFocusForward="@+id/editText1"
... />
<Button
android:id="@+id/button2"
android:layout_below="@id/button1"
android:nextFocusForward="@+id/button1"
... />
<EditText
android:id="@id/editText1"
android:layout_alignParentBottom="@+id/button2"
android:layout_toLeftOf="@id/button2"
android:nextFocusForward="@+id/button2"
... />
RelativeLayout>
当然还有导航箭头的属性,如:
android:nextFocusUp、android:nextFocusDown、android:nextFocusLeft、android:nextFocusRight
简单键盘事件:
不言而喻,就是对用户点击键盘事件做监听。
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch(keCode) {
case KeyEvent.KEYCODE_D:
moveShip(MOVE_LEFT);
return true;
case KeyEvent.KEYCODE_F:
moveShip(MOVE_RIGHT);
return true;
case KeyEvent.KEYCODE_J:
fireMachineGun();
return true;
case KeyEvent.KEYCODE_K:
fireMissle();
return true;
default:
return super.onKeyUp(keyCode, event);
}
}
修饰键:
就是当Shift或者Ctrl键组合使用时,就需要判断KeyEvent中是否有相关的修饰键信息。一般shift和ctrl可以用isShiftPressed()和isCtrlPressed()检测。
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch(keyCode) {
case KeyEvent.KEYCODE_J:
if (event.isShiftPressed()) {
fireLaser();
} else {
fireMachineGun();
}
return true;
case KeyEvent.KEYCODE_K:
if (event.isShiftPressed()) {
fireSeekingMissle();
} else {
fireMissile();
}
return true;
default:
return super.onKeyUp(keyCode, event);
}
}
好了,到这里差不多了。
提一下,第一次用CSDN的MarkDown编辑器写博客,起因是不会调整原先那个编辑器里的表格,一翻折腾下来感觉很爽啊。