JiaoZiVideoPlayer与键盘动作监听布局的冲突

10 篇文章 0 订阅
4 篇文章 0 订阅

昨天,项目需要实现一个在线播放器功能,左挑右选挑中了JiaoZiVideoPlayer,于是着手集成,选中的是6.0.0版本的库。

问题

集成之后发现一个问题,播放器全屏,然后退出全屏后,布局的一部分不接受点击事件了!具体来说,我自定义的一个监听键盘状态变化的布局KeyboardLayout作为根布局,然后下面一个NestedScrollView和一个LinearLayout依次排列,然后退出全屏后NestedScrollView整个布局都不接受点击事件了,和它并列的LinearLayout却还可以点击。排查良久,发现是自定义的KeyboardLayout和播放器起的冲突,该布局代码如下:

public class KeyboardLayout1 extends LinearLayout {
    public static final byte KEYBOARD_STATE_SHOW = -3;
    public static final byte KEYBOARD_STATE_HIDE = -2;
    public static final byte KEYBOARD_STATE_INIT = -1;
    private boolean mHasInit;
    private boolean mHasKeybord;
    private int mHeight;
    private onKybdsChangeListener mListener;

    @SuppressLint("NewApi")
    public KeyboardLayout1(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public KeyboardLayout1(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public KeyboardLayout1(Context context) {
        super(context);
    }
    /**
     * set keyboard state listener
     */
    public void setOnkbdStateListener(onKybdsChangeListener listener){
        mListener = listener;
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (!mHasInit) {
            mHasInit = true;
            mHeight = b;
            if (mListener != null) {
                mListener.onKeyBoardStateChange(KEYBOARD_STATE_INIT);
            }
        } else {
            mHeight = mHeight < b ? b : mHeight;
        }
        if (mHasInit && mHeight > b) {
            mHasKeybord = true;
            if (mListener != null) {
                mListener.onKeyBoardStateChange(KEYBOARD_STATE_SHOW);
            }
        }
        if (mHasInit && mHasKeybord && mHeight == b) {
            mHasKeybord = false;
            if (mListener != null) {
                mListener.onKeyBoardStateChange(KEYBOARD_STATE_HIDE);
            }
        }
    }

    public interface onKybdsChangeListener{
        public void onKeyBoardStateChange(int state);
    }
}

初步解决

研究了半天也没懂到底是哪里出的问题,所以只能换一种监听键盘的方式了。换成了在Activity里直接监听RootView的高度和根布局 View 的高度差来监听键盘动作。代码如下

首先需要对对应的Activity设置adjustResize

android:windowSoftInputMode="adjustResize"

然后在对应Activity里监听布局变化:

rootLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int heightDiff = binding.root.getRootView().getHeight() - binding.root.getHeight();
        Log.d(TAG, "onGlobalLayout: " + heightDiff);
        if (heightDiff > 300) {
            // 此时软键盘弹出,做相应操作
        } else {
            // 此时软键盘隐藏,做相应操作
        }
    }
});

其中rootlayout是布局文件中的根布局。

原理是监听顶层布局getRootView()与根布局之间的高度差,因为现在很多手机都有虚拟按键,这个虚拟按键会占据一部分高度,大概在 200px 左右,所以设置高度差为 300px,如果高度差大于 300px,就能确定是‘某些东西’弹了出来导致布局重新绘制,而这个‘某些东西’一般来说就是软键盘了。

至于获取顶层布局高度的方法也不止这一种,至少getWindow().getDecorView().getHeight()也是可以的。

留下来的疑惑

为什么这个KeyboardLayout会和播放器其冲突呢,以我现在的菜鸟实力,研究了半天也没弄懂,所以只能曲线救国了,这个问题留待以后探究吧(如果到时候还记得的话)。

Reference: Android 监听软键盘状态的实例详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值