You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:09:25