JiaoZiVideoPlayer与键盘动作监听布局的冲突
来源:互联网 发布:淘宝如何编辑宝贝介绍 编辑:程序博客网 时间:2024/06/05 03:35
昨天,项目需要实现一个在线播放器功能,左挑右选挑中了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 监听软键盘状态的实例详解
- JiaoZiVideoPlayer与键盘动作监听布局的冲突
- iOS 监听蓝牙键盘动作(监听键盘的键值)
- iOS 监听蓝牙键盘动作(监听键盘的键值)
- js监听键盘动作
- js监听键盘动作
- js监听键盘动作 .
- js监听键盘动作
- 使用RecyclerView结合jiaozivideoplayer去加载不同类型的布局
- js 监听监键盘动作
- js 监听监键盘动作
- js 监听监键盘动作
- js 监听监键盘动作
- js 监听监键盘动作
- ListView的Item布局子控件与Item的setOnItemClickListenter监听事件冲突失效的解决方法
- js 监听监键盘动作<一>
- js监听键盘动作之资源<二>
- 键盘的动作
- 监听键盘的弹出与消失
- oracle的语言定义
- SVN更新文件时 报错Checksum mismatch while updating 'D:\workspace\
- 增量pi和pid调节代码
- java 枚举
- 02-Robot Framework 使用简介
- JiaoZiVideoPlayer与键盘动作监听布局的冲突
- 解决:1390 Prepared statement contains too many placeholders
- 【Arduino入门教程之三】超声波传感器的使用
- 欢迎使用CSDN-markdown编辑器
- 生成SSH公钥
- 高可用集群架构DRBD+HEARTBEAT+MYSQL
- 算法之最大流
- python爬取股票数据
- 使用VS进行SqlServer数据库架构比较