软键盘中遇到的梗

开发中避免不了编辑文字,Android系统以为我们提供了软键盘。世界开发中对于系统的软键盘我们总想改点东西。
今天就写一下自己对软键盘的一些修改。

显示尺寸

adjustPan:

Activity的主窗口并不会重新调整大小来为输入法腾出空间,而是窗口的内容会自动上下晃动来保证当前获得焦点的控件不会被键盘遮挡住,然后用户可以看见自己输入的内容。相比于 adjustResize 模式而言,它并不是很令人满意,因为用户必须关闭输入法来和被输入法遮挡住的控件进行交互。


image.png

adjustResize:

Activity的主窗口会重新调整大小来为输入法腾出空间。


image.png

adjustUnspecified:

当前模式并不会明确指定 Activity 使用adjustPan 或者 adjustResize ,系统会自动选择一个模式,选择结果是,如果当前 Activity 的 Window 中,有可以滚动自身内容的控件,比如 ScrollView,那么选择结果就是 adjustResize,因为它认为滚动可以使 Window 中的内容即使在一个很小的区域中也可以被看见。Activity 的默认模式就是这个模式。

adjustNoting:

Activity 的 Window 没有任何变化。

android定义了一个属性,名字为windowSoftInputMode, 这个属性用于设置Activity主窗口与软键盘的交互模式,用于避免软键盘遮挡内容的问题。我们可以在AndroidManifet.xml中对Activity进行设置。

android:windowSoftInputMode=”stateUnchanged|adjustPan”。

该属性可选的值有两部分,一部分为软键盘的状态控制,控制软键盘是隐藏还是显示,另一部分是Activity窗口的调整,以便腾出空间展示软键盘。

Android:windowSoftInputMode的属性设置必须是下面中的一个值,或一个”state”值加一个”adjust”值的组合,各个值之间用 | 分开。

stateUnspecified-未指定状态

当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式。

stateUnchanged-不改变状态

当前界面的软键盘状态,取决于上一个界面的软键盘状态,无论是隐藏还是显示。

stateHidden-隐藏状态

当设置该状态时,软键盘总是被隐藏,不管是否有输入的需求。

stateAlwaysHidden-总是隐藏状态

当设置该状态时,软键盘总是被隐藏,和stateHidden不同的是,当我们跳转到下个界面,如果下个页面的软键盘是显示的,而我们再次回来的时候,软键盘就会隐藏起来。

stateVisible-可见状态

当设置为这个状态时,软键盘总是可见的,即使在界面上没有输入框的情况下也可以强制弹出来出来。

stateAlwaysVisible-总是显示状态

当设置为这个状态时,软键盘总是可见的,和stateVisible不同的是,当我们跳转到下个界面,如果下个页面软键盘是隐藏的,而我们再次回来的时候,软键盘就会显示出来。

adjustUnspecified-未指定模式

设置软键盘与软件的显示内容之间的显示关系。当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这中情况下,系统会根据界面选择不同的模式。

adjustResize-调整模式

该模式下窗口总是调整屏幕的大小用以保证软键盘的显示空间;这个选项不能和adjustPan同时使用,如果这两个属性都没有被设置,系统会根据窗口中的布局自动选择其中一个。

adjustPan-默认模式

该模式下通过不会调整来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的视野范围里面,从而让用户可以看到自己输入的内容。

需求,当手动输入的时候,这时触发刷新时,输入法是显示的,但是对话框显示然后消失后,输入法就被隐藏了。在对话框显示然后消失后,输入法能保持出发刷新时的状态。

解决问题:当把当前 Activity 设置为 stateUnchanged 的时候,并没有达到理想的效果,因为dialog所在的window,没有设置该属性,所以需要把dialog的window也设置为stateUnchanged,方法为:
getWindow().setSoftInputMode()`

自动弹出软键盘

有时候需要一进入Activity后就自动弹出软键盘,可以通过设置一个时间函数来实现,具体写法如下:
方法一:

Timer timer=new Timer(); 
        timer.schedule(new TimerTask() { 

            public void run() { 
                InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
                inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 
            } 
        }, 1000); // 秒后自动弹出

方法二:

Timer timer = new Timer();
timer.schedule(new TimerTask() {

public void run() {
InputMethodManager inputManager =
(InputMethodManager) etInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(etInput, 0);
}

},
1000);// 1秒后自动弹出

不自动弹出软键盘

有时进入Activity后不希望系统自动弹出软键盘,我们可以按照下面的方法来实现:
方法一:
在AndroidMainfest.xml中选择那个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden

<activity Android:name=".Main"
            Android:label="@string/app_name"
            Android:windowSoftInputMode="adjustUnspecified|stateHidden"
            Android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action Android:name="android.intent.action.MAIN" />
                <category Android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

方法二:
让EditText失去焦点,使用EditText的clearFocus方法

EditText edit=(EditText)findViewById(R.id.edit);
              edit.clearFocus();

方法三:
强制隐藏Android输入法窗口

EditText edit=(EditText)findViewById(R.id.edit); 
           InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
           imm.hideSoftInputFromWindow(edit.getWindowToken(),0);

方法四:
EditText始终不弹出软件键盘

EditText edit=(EditText)findViewById(R.id.edit);
         edit.setInputType(InputType.TYPE_NULL);

EditText设置ScrollView压缩背景图片解决办法

在你的Activity里加上

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

动态关闭软键盘

有时希望根据条件动态关闭软键盘,我们可以使用InputMethodManager类,按照下面的方法来实现:
方法一:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); //得到InputMethodManager的实例
if (imm.isActive()) {//如果开启
    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,InputMethodManager.HIDE_NOT_ALWAYS);//关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
}

方法二:

强制隐藏软键盘
 public void KeyBoardCancle() {
  View view = getWindow().peekDecorView();
  if (view != null) {
   InputMethodManager inputmanger = (InputMethodManager) getSystemService(ActivityBase.INPUT_METHOD_SERVICE);
   inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);
  }
 }

方法三:

int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 
getWindow().addFlags(flags); 

方法四:

在onclick事件下.以下方法可行.(如果是EditText失去焦点/得到焦点,没有效果)

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
im.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

InputMethodManager的具体用法可以参考下面的链接:
http://www.apihome.cn/api/android/InputMethodManager.html

软键盘界面按钮功能设置方法

使用android:imeOptinos可对Android自带的软键盘进行一些界面上的设置:

<EditText  
    android:id="@+id/text1"  
    android:layout_width="150dip"  
    android:layout_height="wrap_content" 
    android:imeOptions="flagNoExtractUi"/> 
android:imeOptions="flagNoExtractUi"  //使软键盘不全屏显示,只占用一部分屏幕 

同时,这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键

android:imeOptions="actionNone"  //输入框右侧不带任何提示 
android:imeOptions="actionGo"    //右下角按键内容为'开始' 
android:imeOptions="actionSearch"  //右下角按键为放大镜图片,搜索 
android:imeOptions="actionSend"    //右下角按键内容为'发送' 
android:imeOptions="actionNext"   //右下角按键内容为'下一步' 
android:imeOptions="actionDone"  //右下角按键内容为'完成'  

EditText添加相应的监听器,捕捉用户点击了软键盘右下角按钮的监听事件,以便进行处理。

editText.setOnEditorActionListener(new OnEditorActionListener() { 
        @Override 
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
            Toast.makeText(MainActivity.this, "响应了配置后的按键", Toast.LENGTH_SHORT).show(); 
            return false; 
        } 
}); 

踩过的坑

一、软键盘无法顶起页面

   开发中有个需求是将页面底部的一个按钮顶起,但是开发时发现Android5.0以后的版本设置了adjustResize属性后无法成功顶起。纠结了好久,最后在stackoverflow找到解决方案,那就是在根布局上加上fitsSystemWindow=”true”即可。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
>
<EditText
        android:id="@+id/home_searchInput"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:imeOptions="actionSearch" />
      // 软键盘带搜索按钮
// 对软键盘搜索按钮点击事件捕捉
boolean OnEditorActionListener(TextView v, int actionId, KeyEvent event) {
        if (actionId== EditorInfo.IME_ACTION_SEND
                || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
            //do something;
            return false;
        }
        return false;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容