软键盘输入最佳实践

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

一、EditText

1.指定输入的文本类型

在EditText中指定android:inputType,比如指定为password,即为密码,会不可见明文。
看一下可以指定的输入类型:

常量(xml中使用)代码中设置值描述
dateTYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE日期
datetimeTYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_DATE日期(含时间)
none没有类型,不可编辑
numberTYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_NORMAL数字
numberDecimalTYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_DECIMAL小数
numberPasswordTYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD数字密码
numberSignedTYPE_CLASS_NUMBER | TYPE_NUMBER_FLAG_SIGNED有符号数字
phoneTYPE_CLASS_PHONE手机号
textTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL文本
textAutoCompleteTYPE_TEXT_AUTO_COMPLETE自动完成文本
textAutoCorrectTYPE_TEXT_FLAG_AUTO_CORRECT纠正单词拼写错误
textCapCharactersTYPE_TEXT_FLAG_CAP_CHARACTERS普通字符
textCapSentencesTYPE_TEXT_FLAG_CAP_SENTENCES句子首字母大写
textCapWordsTYPE_TEXT_FLAG_CAP_WORDS单词首字母大写
textEmailAddressTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_ADDRESSemail地址
textEmailSubjectTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_SUBJECT邮件主题
textFilterTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_FILTER文本筛选
textImeMultiLineTYPE_TEXT_FLAG_IME_MULTI_LINE输入法多行
textLongMessageTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_LONG_MESSAGE长消息
textMultiLineTYPE_TEXT_FLAG_MULTI_LINE多行文本
textNoSuggestionsTYPE_TEXT_FLAG_NO_SUGGESTIONS不提示
textPasswordTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD密码
textPersonNameTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PERSON_NAME人名
textPhoneticTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PHONETIC拼音
textPostalAddressTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_POSTAL_ADDRESS邮政
textShortMessageTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_SHORT_MESSAGE短消息
textUriTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_URI文本作为URI
textVisiblePasswordTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD可见密码
textWebEditTextTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EDIT_TEXT网页表单文本
textWebEmailAddressYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS表单上emial地址
textWebPasswordTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_PASSWORD表单上密码
timeTYPE_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中值对应代码中类型对应操作
actionDoneIME_ACTION_DONE完成
actionGoIME_ACTION_GO前往
actionNextIME_ACTION_NEXT下一项
actionNoneIME_ACTION_NONE没有操作关联
actionPreviousIME_ACTION_PREVIOUS前一项
actionSearchIME_ACTION_SEARCH查找
actionSendIME_ACTION_SEND发送
actionUnspecifiedIME_NULL没有关联操作,如果编辑可以就自己设定
normal没有与此编辑器相关联的语义

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

3. AutoCompleteTextView

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

二、软键盘

1.软键盘可见性

1)在activity启动时显示输入法

<application ...>
    <activity 
        android:windowSoftInputMode="stateVisible" .../>  // 有外接键盘时不会显示
</application>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值