一种监听键盘弹起放下和横竖屏切换的方法
来源:互联网 发布:单页面应用网站源码 编辑:程序博客网 时间:2024/04/30 15:54
整理了一种监听键盘弹起放下和横竖屏切换的方法。如下:
import android.app.Activity;import android.graphics.Rect;import android.view.View;import android.view.ViewTreeObserver;import android.util.Log;/** * 监听输入法弹出和屏幕横竖屏切换的管理类 * Created by touch on 2016/10/24. */public class SoftInputAndScreenOrientationChangeManager implements ViewTreeObserver.OnGlobalLayoutListener { private final static String TAG = SoftInputAndScreenOrientationChangeManager.class.getSimpleName(); private View rootView; private Activity mActivity; private OnSoftInputWithDifferListener mOnSoftInputWithDifferListener; private boolean isSoftInputShow = false; public SoftInputAndScreenOrientationChangeManager(Activity activity) { mActivity = activity; this.rootView = mActivity.getWindow().getDecorView(); rootView.getViewTreeObserver().addOnGlobalLayoutListener(this); } /** * 如果仅仅为了获取键盘的弹起状态的话,不需要add这个listener * @param onSoftInputWithDifferListener */ public void addOnSoftInputWithDifferListener(OnSoftInputWithDifferListener onSoftInputWithDifferListener){ mOnSoftInputWithDifferListener = onSoftInputWithDifferListener; } @Override public void onGlobalLayout() { Rect rect = new Rect(); rootView.getWindowVisibleDisplayFrame(rect); int displayHeight = rect.bottom - rect.top; int height = rootView.getHeight(); onLayoutChange(displayHeight, height); } private int initInputTop ,// 最初屏幕的可视高度,键盘未弹起的时候 默认键盘不弹起 lastInputTop ,// 前一次屏幕的可视高度 initWindowHeight ,// 最初的view的高度 默认屏幕是竖屏 lastWindowHeight ,// 前一次的view高度 portraitWindowHeight ,// 竖屏的屏幕高度 landscapeWindowHeight;// 横屏的屏幕高度 private void onLayoutChange(int intputTop, int windowHeight){ if(initInputTop == 0 || initWindowHeight == 0){ lastInputTop = initInputTop = intputTop; lastWindowHeight = initWindowHeight = windowHeight; return; } if(windowHeight == lastWindowHeight){ if(intputTop < lastInputTop && lastInputTop == initInputTop){ Log.v(TAG , "RectHeight:" + intputTop + ",DecorViewHeight:" + windowHeight); isSoftInputShow = true; //键盘弹起 Log.v(TAG,"输入法展示"); if(mOnSoftInputWithDifferListener != null){ if(windowHeight == landscapeWindowHeight){ mOnSoftInputWithDifferListener.isLandscapeInputSoftOpen(); }else { mOnSoftInputWithDifferListener.isPortraitInputSoftOpen(initInputTop - intputTop); } } }else if(intputTop > lastInputTop && intputTop == initInputTop){ Log.v(TAG , "RectHeight:" + intputTop + ",DecorViewHeight:" + windowHeight); isSoftInputShow = false; //键盘收起 Log.v(TAG,"输入法隐藏"); if(mOnSoftInputWithDifferListener != null){ if(windowHeight == landscapeWindowHeight){ mOnSoftInputWithDifferListener.isLandscapeInputSoftClose(); }else{ mOnSoftInputWithDifferListener.isPortraitInputSoftClosed(); } } }else{ //状态保持 } }else if(windowHeight > lastWindowHeight){ //切换为竖屏 Log.v(TAG,"切换为竖屏"); //测试显示 切换横竖屏后 Variables里面的横竖屏高度并没有被改变 initInputTop = intputTop; initWindowHeight = windowHeight; portraitWindowHeight = windowHeight; if(mOnSoftInputWithDifferListener != null){ mOnSoftInputWithDifferListener.isPortrait(); } }else if(windowHeight < lastWindowHeight ){ //切换为横屏 Log.v(TAG,"切换为横屏"); initInputTop = intputTop; initWindowHeight = windowHeight; landscapeWindowHeight = windowHeight; if(mOnSoftInputWithDifferListener != null){ mOnSoftInputWithDifferListener.isLandscape(); } } lastInputTop = intputTop; lastWindowHeight = windowHeight; } /** * 获取键盘弹起状态 * @return */ public boolean isSoftInputShow(){ return isSoftInputShow; }}
处理事件的回调接口
/** * 输入法状态 和 横竖屏和状态发生 改变后 的 回调 * Created by touch on 2016/10/24. */public interface OnSoftInputWithDifferListener { void isPortraitInputSoftOpen(int differ); void isPortraitInputSoftClosed(); void isLandscape(); void isPortrait(); void isLandscapeInputSoftOpen(); void isLandscapeInputSoftClose();}
如果仅仅是为了获得键盘的状态,不需要使用这个方法:
/** * 如果仅仅为了获取键盘的弹起状态的话,不需要add这个listener * @param onSoftInputWithDifferListener */ public void addOnSoftInputWithDifferListener(OnSoftInputWithDifferListener onSoftInputWithDifferListener){ mOnSoftInputWithDifferListener = onSoftInputWithDifferListener; }
直接使用这个即可:
/** * 获取键盘弹起状态 * @return */ public boolean isSoftInputShow(){ return isSoftInputShow; }
此种方法主要是为了解决各种奇葩的输入法显示隐藏操作,比如常用的sougou输入法右上角有一个收起按钮,无法被监听。使用此种方法可以做到有效监听。
0 0
- 一种监听键盘弹起放下和横竖屏切换的方法
- android 监听键盘的弹起和隐藏
- 项目需求之Android 监听键盘的弹起和隐藏&setVisibility(View.GONE)方法失效
- iOS监听系统键盘的弹起和回收
- 键盘弹起和消失的监听2中方式
- NSNotificationCenter监听键盘弹起和隐藏事件
- Android 键盘弹起和回落事件监听
- ios 监听键盘弹起时间和高度
- ios-监听键盘的弹起事件
- 键盘弹起收回监听
- iOS键盘弹起,上移视图,和其它的方法大同小异,只不过我在viewDidLayoutSubviews 中写的改变frame方法,这样就不用监听键盘什么的了
- 横竖屏切换监听 android
- JS监听横竖屏切换
- android横竖屏切换的生命周期和调用方法
- android:configChanges属性 和 监听横竖屏切换
- 设置横竖屏不走生命周期后,监听横竖屏的方法
- android 键盘弹起/收起监听
- android监听键盘是否弹起
- Android Context 是什么?
- 新闻发布项目——业务逻辑层(categoryTBServiceImpl)
- 构造函数小结
- Android7.0 Vold 进程工作机制分析之由MountService发起挂载请求
- Insertion Sort List ---LeetCode
- 一种监听键盘弹起放下和横竖屏切换的方法
- CentOS学习21_ CentOS 配置防火墙操作实例(启、停、开、闭端口)
- Wins10系统忘记开机密码快速解锁方法(图文教程)
- CVPR 2016-11-23
- java 发送邮件
- 类的构造方法
- 新闻发布项目——业务逻辑层(commentServiceImpl)
- [NOIP2014]飞扬的小鸟
- linux