一种监听键盘弹起放下和横竖屏切换的方法

来源:互联网 发布:单页面应用网站源码 编辑:程序博客网 时间: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
原创粉丝点击