Android之监听手机软键盘弹起与关闭

来源:互联网 发布:个人网络招商 编辑:程序博客网 时间:2024/05/17 23:25

背景:

在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起与关闭。


预备知识:

在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

那么这里值的含义列表如下:

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

【C】stateHidden:用户选择activity时,软键盘总是被隐藏

【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

【E】stateVisible:软键盘通常是可见的

【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分



示例:

(1)首先我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:

        <activity            android:name="com.bear.softkeyboardlistener.MainActivity"            android:label="@string/app_name"            android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>


这样设置之后,当有软键盘弹起来的时候,Activity的布局大小会被压缩上去,但是你仍然可以通过滑动浏览所有。


(2)我们要为Activity的最外面的Layout设置一个OnLayoutChangeListener监听器:

import com.bear.bearbroadcastreceiver.R;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnLayoutChangeListener;import android.widget.Toast;public class MainActivity extends Activity implements OnLayoutChangeListener{//Activity最外层的Layout视图private View activityRootView;//屏幕高度private int screenHeight = 0;//软件盘弹起后所占高度阀值private int keyHeight = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);activityRootView = findViewById(R.id.root_layout);//获取屏幕高度screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();//阀值设置为屏幕高度的1/3keyHeight = screenHeight/3;}@Overrideprotected void onResume() {super.onResume();//添加layout大小发生改变监听器activityRootView.addOnLayoutChangeListener(this);}@Overridepublic void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {//old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值//System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);//System.out.println(left + " " + top +" " + right + " " + bottom);//现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();}else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();}}


下面是整个demo源码的下载链接:

Android SoftKeyboard Listener Demo

8 11
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿感冒咳嗽怎么办%3f 小孩流鼻涕鼻塞怎么办最简单方法 宝宝鼻炎鼻子不通气怎么办 小孩晚上睡觉鼻子不通气怎么办 孩子晚上睡觉鼻子不通气怎么办 3个月婴儿流鼻涕怎么办 一个月宝宝鼻塞流鼻涕怎么办 我的鼻子不通气怎么办 鼻子擦多了疼怎么办 鼻涕擦多了好疼怎么办 鼻炎一直流鼻水怎么办 擤鼻涕后耳朵堵怎么办 鼻涕醒多了头疼怎么办 感冒鼻子破皮了怎么办 感冒鼻子擦红了怎么办 擤鼻涕时耳朵疼怎么办 鼻涕进耳朵里了怎么办 怀孕6个月生病了怎么办 浓鼻涕擤不出来怎么办 有鼻涕在鼻腔里怎么办 感冒鼻子擤的疼怎么办 擤鼻涕耳膜破了怎么办 钢铁雄心4闪退怎么办 钢铁雄心4太卡怎么办 无主之地2卡怎么办 卡盟给骗了怎么办 玩偶吸盘不吸了怎么办 买的吸盘吸不住怎么办 苹果6gps信号弱怎么办 魅蓝gps信号弱怎么办 小天才手表丢了怎么办 小天才2代进水了怎么办 ck的后盖上不了怎么办 冬天车玻璃有霜怎么办 热水管头坏了怎么办 注塑机螺杆包胶怎么办 造粒螺杆粘料怎么办 xp开机密码忘了怎么办 10玩战地2卡怎么办? win10战地1闪退怎么办 战地1已停止工作怎么办