软键盘输入最佳实践

这章记录下Android软键盘的使用

一、EditText

1.指定输入的文本类型

在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”

2.处理输入法上的操作

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 没有与此编辑器相关联的语义

还有几个不常用就不写了,而且也不太理解到底是干嘛用的

3. AutoCompleteTextView

可以通过调用setAdapter()方法来设置其提示的文本内容,以便点击自动输入。例子就不写了。

二、软键盘

1.软键盘可见性

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 主窗口的尺寸来为软键盘腾出空间, 而是自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。 这通常不如尺寸调正可取,因为用户可能需要关闭软键盘以到达被遮盖的窗口部分或与这些部分进行交互


2.处理软键盘导航

当使用键盘上的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

3.处理键盘事件

简单键盘事件:
不言而喻,就是对用户点击键盘事件做监听。

@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编辑器写博客,起因是不会调整原先那个编辑器里的表格,一翻折腾下来感觉很爽啊。

你可能感兴趣的:(Android,training+guide,随笔)