软键盘问题汇总

软键盘在Android中是重要的输入设备,如果我们对其进行友好化优化的话,对提高用户体验有大大的帮助。

1. InputMethodManager

InputMethodManager是软键盘的管理类,我们可以用它来控制软键盘的展开、隐藏等操作。

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
 //隐藏软键盘
 imm.hideSoftInputFromWindow(getActivity().getWindow().getDecorView().getWindowToken(), 0);
 //切换键盘
  if(imm.isActive()){                 imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,InputMethodManager.HIDE_NOT_ALWAYS);
 }

2. windowSoftInputMode

WindowSoftInputMode是控制软键盘的启动模式,一般在theme 或者manifest中设置

描述
stateUnspecified 软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。
stateUnchanged 软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。
stateHidden 当用户选择该Activity时,软键盘被隐藏——也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。
stateAlwaysHidden 软键盘总是被隐藏的,当该Activity主窗口获取焦点时
stateVisible 软键盘是可见的,当那个是正常合适的时(当用户导航到"Activity主窗口时)
stateAlwaysVisible 当用户选择这个Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。
adjustUnspecified 它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。
adjustResize 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间
adjustPan 该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

解决Andriod软键盘出现把原来的布局给顶上去的方法

//在mainfest.xml中,对那个Activity加:
<activity android:name=".activity.HomeActivity"
          android:windowSoftInputMode="adjustPan|stateHidden"/>

3.WindowManager.LayoutParams.softInputMode

WindowManager.LayoutParams.softInputMode 是Window上的属性,当设置其属性时,如果之前在主题上设置上windowSoftInputMode将会override。如果采用其他许多办法无法关闭显示软键盘,可以设置WindowManager.LayoutParams.softInputMode,将会起到想不到的好效果

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
softInputMode 描述
SOFT_INPUT_MASK_STATE 软输入区域是否可见
SOFT_INPUT_STATE_UNSPECIFIED 未指定状态
SOFT_INPUT_STATE_UNCHANGED 不要修改软输入法区域的状态
SOFT_INPUT_STATE_HIDDEN 隐藏输入法区域(当用户进入窗口时)
SOFT_INPUT_STATE_ALWAYS_HIDDEN 当窗口获得焦点时,隐藏输入法区域。
SOFT_INPUT_STATE_VISIBLE 显示输入法区域(当用户进入窗口时)
SOFT_INPUT_STATE_ALWAYS_VISIBLE 当窗口获得焦点时,显示输入法区域
SOFT_INPUT_MASK_ADJUST 窗口应当主动调整,以适应软输入窗口
SOFT_INPUT_ADJUST_UNSPECIFIED 未指定状态,系统将根据窗口内容尝试选择一个输入法样式
SOFT_INPUT_ADJUST_RESIZE 当输入法显示时,允许窗口重新计算尺寸,使内容不被输入法所覆盖。不可与SOFT_INPUT_ADJUSP_PAN混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项
SOFT_INPUT_ADJUST_PAN 输入法显示时平移窗口。它不需要处理尺寸变化,框架能够移动窗口以确保输入焦点可见。不可与SOFT_INPUT_ADJUST_RESIZE混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项。
SOFT_INPUT_IS_FORWARD_NAVIGATION 当用户转至此窗口时,由系统自动设置,所以你不要设置它。当窗口显示之后该标志自动清除

4.InputType

我们使用EditText有时为了提高用户体验,在弹出软键盘时需要设置键盘的面板状况,有时需要展示中文键盘,数字键盘,英文键盘等等。
可以设置InputType。EditText的InputType可以输入两种类型,一种EditorInfo,一种是InputType。EditorInfo是InputType实现类
Android并没有提供设置默认的输入状态的接口,但我们可以通过如下方法一样能够达到想要的效果:
InputType可以在Xml设置,或者直接在代码中设置。
默认数字键盘

mEditText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

默认中文键盘

mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);

默认英文键盘

mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);

5.ImeOption

改变输入法中回车按钮的显示内容,如果回车按钮是执行搜索功能,则回车按钮上显示”搜索”,如果是执行发送功能,则显示”发送”,如果是下一步,则显示”下一步”。

/**
*
* IME_ACTION_SEARCH 搜索
* IME_ACTION_SEND 发送
* IME_ACTION_NEXT 下一步
* IME_ACTION_DONE 完成
*/
mInputEditTxt.setImeOptions(EditorInfo.IME_ACTION_SEARCH);

6.关闭软键盘的N中方法

  • 方式一:InputMethodManager
 EditText edit=(EditText)findViewById(R.id.edit);  
           InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
           imm.hideSoftInputFromWindow(edit.getWindowToken(),0);
  • 方式二:clearFocus 失去焦点
EditText edit=(EditText)findViewById(R.id.edit);
           edit.clearFocus();
  • 方式三:InputType 默认EditText始终不弹出软键盘
EditText edit=(EditText)findViewById(R.id.edit);
       edit.setInputType(InputType.TYPE_NULL);

7.KEYCODE

在软键盘输入中我们需要监听我们按的键,我们可以用OnkeyListener监听按键。例如
KeyEvent.KEYCODE_Z、KeyEvent.KEYCODE_ENTER等按键。

    mInputEditTxt.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
                System.out.println("手指弹起时执行确认功能");
                return true;
            }
            return false;
        }
    });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容