Android评论发图功能实现以及软键盘的监听和获得软键盘的高度

这几天相对来说比较闲做了一个评论添加图片的效果,这里写图片描述
这里写图片描述
就是这个效果,主要的难点就是 软键盘的监听 和软键盘的大小 废话不多说,
上代码

   layoutListener= new ViewTreeObserver.OnGlobalLayoutListener(){
            //当键盘弹出隐藏的时候会 调用此方法。
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                //获取当前界面可视部分
                PostDetailsActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);//获得可视大小
                //获取屏幕的高度
                int screenHeight =  PostDetailsActivity.this.getWindow().getDecorView().getRootView().getHeight();
                //此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数
                int heightDifference = screenHeight - r.bottom;
                if (heightDifference!=0){
                    //键盘显示状态 或者华为虚拟键盘显示
                    if (mMaxHeight==0&&mMinHeight==0){
                        //第一次赋值
                        mMaxHeight=heightDifference;
                        mMinHeight=heightDifference;
                    }
                    if (heightDifference>mMaxHeight){
                        mMaxHeight=heightDifference;//获得最大的
                    }
                    if (heightDifference<mMinHeight){
                        mMinHeight=heightDifference;//获得最小的
                    }
                    if (mMaxHeight-mMinHeight!=0){
                        //说明有华为软键盘
                        mKeyheight=mMaxHeight-mMinHeight;//获得真正键盘高度
                    }else {
                        //没有就随意啦
                        mKeyheight=heightDifference;
                    }
                    if (mMaxHeight!=mMinHeight&&heightDifference==mMinHeight){
                        //是华为软键盘的高度 所以也是软键盘隐藏的状态
                        if (mImageSwitch) {
                            //如果是开添加图片状态  点添加图片的时候软键盘会消失 但有的时候RV回不显示
                            // 所以只能监听 如果是图片选择开启状态 强制获得集合 并且重新设置刷新
                            if (mImageRecyclerViewAdapter != null) {
                                List<PhotoInfo> photoInfos = mImageRecyclerViewAdapter.getPhotoInfos();
                                mImageRecyclerViewAdapter.setPhotoInfos(photoInfos);
                            }
                        }
                        mImageSwitch=false;//只有软键盘显示的是添加图片或者什么都没有
                        //下次弹出键盘走下面隐藏
                    }else {
                        //正常弹出输入法
                        if (!mImageSwitch) {
                            //不显示添加图片隐藏RV,展示键盘输入法
                            setRVheight(0);//软键盘显示 RV高度肯定是0的 选择图片模式 键盘显示图片隐藏 正常状态隐藏RV
                        }
                    }

                }else {
                    //键盘隐藏
                    //键盘隐藏
                    if (mImageSwitch){
                        //如果是开添加图片状态  点添加图片的时候软键盘会消失 但有的时候RV回不显示
                        // 所以只能监听 如果是图片选择开启状态 强制获得集合 并且重新设置刷新
                        if (mImageRecyclerViewAdapter!=null) {
                            List<PhotoInfo> photoInfos = mImageRecyclerViewAdapter.getPhotoInfos();
                            mImageRecyclerViewAdapter.setPhotoInfos(photoInfos);
                        }
                        mImageSwitch=false;//下次软键盘弹出隐藏RV
                    }
                }
            }
        };
        mViewPostEdittext.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
   /**
     * <p>
     * 设置RV高度 选择图片大小应该和软键盘一样大
     * </p>
     * Author: Wu.Chen <br/>
     * Date:2017/5/15
     */
private void setRVheight(int keyHeight){
    ViewGroup.LayoutParams params= mRlAddimage.getLayoutParams();
    params.height=keyHeight;
    mRlAddimage.setLayoutParams(params);//设置
}  

这里的RV其实就是RelativeLayout 我在里面放了一个RecyclerView用来添加图片的

这个主要就是获得OnGlobalLayoutListener 获得可视界面和屏幕界面大小,
两个高就是软键盘的变化大小 所以当这个heightDifference不为0的时候 说明这个高度就是软键盘的高度,但是还有有一个坑的,就是我发现华为是有自己虚拟键盘的 所以这个值不为0的时候 也是有可能软键盘隐藏的 会造成冲突 所以这里我用两个值 分辨获得除了0最大的值和最小的值,如果这两个值相同 就说明没有华为虚拟软键盘 如果不同 就说明有,并且记录真实软键盘的高度,第二点就是对于软件盘的监听,我们知道heightDifference 当时0 和 最小值的时候(如果有虚拟键盘的话)说明软键盘是隐藏的 软键盘隐藏的时候我要把我放图片的RelativeLayout的高度设置为0 但是只有一种情况 隐藏软键盘RelativeLayout的高度不是0,也就是我们添加图片的时候这里写图片描述
这样的效果 所以当点击这个加号按钮的时候 我这里的方式是给一个布尔值 也就是上面所看到的mImageSwitch 当为ture的时候就是开启图片的状态 不走设置RelativeLayout为0的方法 这里还有一个莫名其妙的坑就是我设置数据传到我的Adapter里面 但是有的点击的时候这个里面没有数据 所以我又在点开添加图片mImageSwitch 为ture的时候重新获得我选择图片的数据然后设置进去 就搞定了 最后记得这个今天非常的耗内存

 @Override
    protected void onDestroy() {
        super.onDestroy();

      mViewPostEdittext.getViewTreeObserver()
                .removeGlobalOnLayoutListener(layoutListener);//注销监听

    }

记得释放掉 - -还有就是当这个RelativeLayout 不为0,添加图片展示的时候 按返回建我们要有和软键盘一样的效果 让他消失 所以

 @Override
    public void onBackPressed() {
        ViewGroup.LayoutParams params= mRlAddimage.getLayoutParams();
        if (params.height!=0){
            //如果RV高度不是0 比如是选择图片状态
            setRVheight(0);
        }else {
            super.onBackPressed();
        }
    }

体验优化更好一点 顺便说一下我这里用的图片选择框架是

compile 'cn.finalteam:galleryfinal:1.4.8.7'

不过这个好像已经不维护了你们可以用更好的框架 7.0系统如果打开相机拍照会有URL权限问题 记得在Application 里面 onCreate()方法添加一句

  @Override
    public void onCreate() {//程序的入口方法
 //7.0相机权限问题 URL含有File都算你没权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
        }
        }

就可以啦 下一篇我会说一下我添加图片RecyclerView的实现方式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值