Leanback中focusOutFront在VerticalGridSupportFragment不生效问题
Android TV Leanback库VerticalGridSupportFragment焦点移出问题
开发背景
我使用Leanback库开发Android TV应用,当前页面需要展示频道列表及对应EPG(电子节目指南)数据,已通过VerticalGridSupportFragment完成频道列表的加载渲染。页面同时设置了日期筛选按钮,支持按所选日期过滤EPG列表,频道列表、EPG区域与筛选按钮的布局如下图所示:
故障现象
当前焦点导航存在异常:
- 焦点可从筛选按钮正常移动到下方的频道列表区域
- 无法从频道列表反向移动回上方的筛选按钮,需要实现焦点从
VerticalGridSupportFragment向前(front方向)移出、聚焦到外部其他视图的能力
我已尝试通过样式配置、自定义VerticalGridPresenter两种方式设置focusOutFront="true",均未生效:目前仅start、end方向的焦点移出功能正常,front方向的焦点移出始终失效。相同配置在RowSupportFragment中可正常运行,仅在VerticalGridSupportFragment中不工作。
已尝试的无效方案
样式配置
尝试通过主题样式覆盖配置焦点移出属性,代码如下:
<style name="AppThemeLeanbackVerticalGridView" parent="AppThemeLeanback"> <item name="headersVerticalGridStyle">@style/AppThemeLeanbackHeadersVerticalGridView</item> <item name="itemsVerticalGridStyle">@style/AppThemeLeanbackGridItemsVerticalGridView</item> <item name="rowsVerticalGridStyle">@style/AppThemeLeanbackHorizontalGridView</item> </style> <style name="AppThemeLeanbackHeadersVerticalGridView" parent="Widget.Leanback.Headers.VerticalGridView"> <item name="focusOutFront">true</item> <item name="focusOutEnd">true</item> <item name="focusOutSideStart">true</item> <item name="focusOutSideEnd">true</item> </style> <style name="AppThemeLeanbackGridItemsVerticalGridView" parent="Widget.Leanback.GridItems.VerticalGridView"> <item name="focusOutFront">true</item> <item name="focusOutEnd">true</item> <item name="focusOutSideStart">true</item> <item name="focusOutSideEnd">true</item> </style> <style name="AppThemeLeanbackHorizontalGridView" parent="Widget.Leanback.Rows.VerticalGridView"> <item name="focusOutFront">true</item> <item name="focusOutEnd">true</item> <item name="focusOutSideStart">true</item> <item name="focusOutSideEnd">true</item> </style>
自定义VerticalGridPresenter
尝试自定义Presenter,在初始化GridView时手动设置焦点移出允许属性,代码如下:
class CustomVerticalGridPresenterFocusOut internal constructor( context: Context, private val padding: Int, focusZoomFactor: Int, useFocusDimmer: Boolean ) : VerticalGridPresenter(focusZoomFactor, useFocusDimmer) { private lateinit var gridView: VerticalGridView override fun initializeGridViewHolder(vh: ViewHolder) { super.initializeGridViewHolder(vh) gridView = vh.gridView val top = padding // 自定义顶部padding值 val bottom = gridView.paddingBottom val right = gridView.paddingRight val left = gridView.paddingLeft gridView.setPadding(left, top, right, bottom) gridView.setFocusOutSideAllowed(throughStart = true, throughEnd = true) gridView.setFocusOutAllowed(throughFront = true, throughEnd = true) } }
诉求
需要可行的解决方案,实现VerticalGridSupportFragment的front方向焦点移出功能。
内容的提问来源于stack exchange,提问作者Kabindra Shrestha
相关产品推荐
相关产品推荐

