Android学习之监听软键盘的弹起关闭

来源:互联网 发布:淘宝的正品保证有用吗 编辑:程序博客网 时间:2024/05/21 16:27

今天在项目中遇见需要监听软键盘的弹起与关闭功能,因此在网上查找了一下资料,并实践成功,因为回家以记之。

分析:

1.软件盘弹起与关闭需要顶起布局。

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

要实现布局被顶起,需要在清单文件下做如下设置。

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

2.监听软键盘顶起布局的距离来判断弹起与关闭。

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 RelativeLayout activityRootView;    //屏幕高度    private int screenHeight = 0;    //软件盘弹起后所占高度阀值    private int keyHeight = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        activityRootView = findViewById(R.id.root_layout);        //获取屏幕高度        screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();        //阀值设置为屏幕高度的1/3        keyHeight = screenHeight/3;    }    @Override    protected void onResume() {        super.onResume();        //添加layout大小发生改变监听器        activityRootView.addOnLayoutChangeListener(this);    }    @Override    public 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();        }    }

这里activityRootView是根布局,可以根据情况设置,通过OnLayoutChangeListener来监听布局位移。

if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight))

底部起始位置不为零,移动后的位置不为零,位移大于屏幕三分之一高度,即可视为软件盘弹起。

很好理解,就不贴代码了,感谢博主
http://blog.csdn.net/bear_huangzhen/article/details/45896333

在给大家推荐一个软件盘工具类,来控制软键盘的弹起与隐藏。

package com.zhy.utils;import android.content.Context;import android.view.inputmethod.InputMethodManager;import android.widget.EditText;/** * 打开或关闭软键盘 *  * @author zhy *  */public class KeyBoardUtils{    /**     * 打卡软键盘     *      * @param mEditText     *            输入框     * @param mContext     *            上下文     */    public static void openKeybord(EditText mEditText, Context mContext)    {        InputMethodManager imm = (InputMethodManager) mContext                .getSystemService(Context.INPUT_METHOD_SERVICE);        imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,                InputMethodManager.HIDE_IMPLICIT_ONLY);    }    /**     * 关闭软键盘     *      * @param mEditText     *            输入框     * @param mContext     *            上下文     */    public static void closeKeybord(EditText mEditText, Context mContext)    {        InputMethodManager imm = (InputMethodManager) mContext                .getSystemService(Context.INPUT_METHOD_SERVICE);        imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);    }}
2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 举报19楼帖子但是不给删除怎么办 新浪微博手机号被注册了怎么办 忘记新浪微博绑定的邮箱账号怎么办 申诉找回微信账号密码失败怎么办 注册微信号时验证码错误怎么办 老板让写的报道没有当天写完怎么办 洛奇英雄传镶嵌有微章的时装怎么办 上午12点用24小时制怎么办 三分钟看懂捷信个人贷款怎么办 精神不正常的父亲到单位闹怎么办 母亲和父亲一直和我闹怎么办 儿子拿了父亲的钱买手机怎么办 电动车骑的慢的时候车头打漂怎么办 二晓啊相公太爱我了怎么办全文免费 车牌被套牌了又有违章怎么办 高中生只学好主课副科学不好怎么办 母泰迪怀孕23天了不吃饭怎么办 媳妇一再触碰我的底线怎么办 发票商品编码好多选错了分类怎么办 吃了用福尔马林泡的食物怎么办 没大没小说话不尊重人的孩子怎么办 升级安卓8.0后app闪退怎么办 业主装门占用消防通道物业怎么办? 想改名字派出所不给改怎么办 物业不给地热打压影响装修怎么办 pos机pin效码验证错误怎么办 苹果下载东西要发验证码怎么办 接口断在了丝扣里面怎么办 政府下了一张关停取缔单怎么办 微信运动数据不刷新了怎么办 邻居霸占我的土地不还我该怎么办 双层水浴式杀菌锅阀门坏了怎么办 通下水管的钢丝断水管里了怎么办 塑料水管与水阀连接处漏水怎么办 介质流向标识管道温度太高怎么办 雪碧里气体太多瓶子涨得要炸怎么办 餐厅不清洗油烟管道物业该怎么办 用完权健洁净宝后奇痒的厉害怎么办 老房子铸铁暖气管从外锈蚀了怎么办 德意壁挂炉补水多了水压过高怎么办 新空调的散热片铜管漏了怎么办