美文网首页
Android监听软键盘弹出与隐藏

Android监听软键盘弹出与隐藏

作者: 寻味Android | 来源:发表于2017-09-27 10:48 被阅读0次

    监听布局的GlobalLayoutListener来实现对软键盘弹出与隐藏的监听,先上代码:

    public   class  SoftKeyBoardUtil   implements   ViewTreeObserver.OnGlobalLayoutListener {

    private   final  ActivitymAct;

    private   SoftKeyBoardListener   mListener;

    private   View   mChildOfContent;

    private   int  usableHeightPrevious;

    public  SoftKeyBoardUtil(Activity act){

    this.mAct=act;

    }

    /**

    * 软件盘监听

    *@paramlistener

    */

    public    void    setListener(SoftKeyBoardListener    listener){

    this.mListener=listener;

    }

    /**

    * 监听GlobalLayoutListener

    */

    public  void    addGlobalLayoutListener(){

    mChildOfContent=((ViewGroup)mAct.findViewById(android.R.id.content)).getChildAt(0);

    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this);

    }

    /**

    * 移除GlobalLayoutListener

    */

    public void   removeGlobalLayoutListener(){

    mChildOfContent.getViewTreeObserver().removeGlobalOnLayoutListener(this);

    }

    /**

    * 软键盘展示与隐藏逻辑判断

    */

    @Override

    public void   onGlobalLayout() {

    int  usableHeightNow = computeUsableHeight();

    if(usableHeightNow !=usableHeightPrevious) {

    usableHeightPrevious=usableHeightNow;

    int  usableHeightSansKeyboard =mChildOfContent.getRootView().getHeight();

    int   heightDifference = usableHeightSansKeyboard - usableHeightNow;

    //判断软键盘是否显示逻辑,可以根据具体情况修改

    boolean    isKeyBoardShow=heightDifference > (usableHeightSansKeyboard/4);

    if(mListener!=null){

    mListener.OnSoftKeyboardStateChangedListener(isKeyBoardShow,usableHeightNow);

    }

    }

    }

    private   int   computeUsableHeight() {

    Rect  rect =new   Rect();

    mChildOfContent.getWindowVisibleDisplayFrame(rect);

    // rect.top其实是状态栏的高度,如果是全屏主题,直接 return rect.bottom就可以了

    return(rect.bottom- rect.top);

    }

    /**

    * 软键盘监听接口

    */

    public    static    interface    SoftKeyBoardListener{

    void   OnSoftKeyboardStateChangedListener(booleanisKeyBoardShow, intkeyboardHeight);

    }

    通过mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this)监听mChildOfContent的布局变化,核心代码是onGlobalLayout()、computeUsableHeight()方法,computeUsableHeight()通过view的getWindowVisibleDisplayFrame(rect)获取view的可见视图区,通常软键盘的弹出隐藏,mChildOfContent的可视区会变化,通过这个computeUsableHeight()获取可视区得高度,然后在onGlobalLayout()方法里处理软键盘是否显示逻辑;boolean   isKeyBoardShow=heightDifference > (usableHeightSansKeyboard/4)这个判断逻辑可以根据情况自己修改。

    相关文章

      网友评论

          本文标题:Android监听软键盘弹出与隐藏

          本文链接:https://www.haomeiwen.com/subject/pgnzsxtx.html