ExoPlayer控制器按钮初始化阶段异常高亮问题求助
嘿,这个问题我之前也碰到过类似的,别慌,咱们一步步来拆解排查:
先确认视图选中状态的初始化逻辑
首先检查那个按钮的selected属性在布局文件或者初始化代码里是不是被默认设为true了?有时候布局里的android:selected="true"会在初始化时直接生效,但控制器隐藏再显示时,可能会重新走状态重置逻辑,把这个状态修正了。你可以在初始化后立刻打印一下按钮的isSelected()值,看看是不是确实初始就是选中状态。跟踪ExoPlayer控制器的生命周期回调
ExoPlayer的控制器(比如PlayerControlView)有自己的显示/隐藏回调,你可以监听setControllerVisibilityListener,看看在初始化阶段、隐藏、重新显示这几个节点,按钮的状态有没有被修改。特别是初始化时,有没有什么内部逻辑(比如默认焦点处理、选中状态同步)触发了按钮高亮。另外,也可以看看控制器的onFinishInflate()或者onAttachedToWindow()方法里有没有相关的状态设置。排查焦点与选中状态的混淆
有时候按钮的高亮可能不是selected状态,而是焦点状态(focused)。初始化时视图树可能会自动给某个可交互控件分配焦点,导致看起来像是被选中了。你可以检查按钮的isFocused()值,或者在布局里给按钮设置android:focusable="false"(仅测试用,别直接上线)看看是不是焦点导致的。另外,ExoPlayer控制器默认可能会处理焦点,比如播放时自动把焦点给到播放按钮?检查自定义控制器的状态同步逻辑
如果你用的是自定义的控制器布局,而不是默认的PlayerControlView,那要看看有没有和ExoPlayer状态绑定的逻辑。比如初始化时有没有错误地把按钮的选中状态和某个Player状态(比如播放/暂停)同步,但此时Player还没进入正确的状态,导致误触发。比如player.getPlayWhenReady()在初始化时可能是默认值,而你的按钮逻辑直接绑定了这个值,就会出现异常高亮。用调试工具追踪状态变化
给按钮的setOnSelectedChangeListener加个监听,打印每次状态变化的调用栈,看看初始化时是谁触发了选中状态的改变。或者用Android Studio的Layout Inspector,在初始化阶段直接查看按钮的属性,确认是selected、focused还是activated状态导致的高亮。排查ExoPlayer版本或自定义样式的问题
不同版本的ExoPlayer可能在控制器初始化时有不同的默认行为,如果你最近升级过版本,可以试试回退到之前的版本看看问题是否消失。另外,检查控制器的样式(比如style="@style/Widget.ExoPlayer.ControlView")有没有自定义的状态选择器(selector),可能选择器里的默认状态设置有问题。
内容的提问来源于stack exchange,提问作者Arnaud

