【问题标题】:Android TV Leanback RowsFragment keep focused item at the startAndroid TV Leanback RowsFragment 在开始时保持焦点项目
【发布时间】:2019-04-30 07:25:40
【问题描述】:

我正在开发一个 Leanback 应用程序,我已经通过 RowsFragment 实现了行和所有内容,并且一切正常。

至于现在,当我在行中的项目内左右移动时,焦点项目会移动到屏幕中间并获得焦点。

示例 -

我希望获得焦点的项目停留在行首而不是中间。

示例 -

在网上找不到任何关于此的内容。 非常感谢有关此的任何信息。

【问题讨论】:

  • 尝试查看有关如何有效[创建电视导航](developer.android.com/training/tv/start/navigation) 的文档。 “Android 框架会根据布局中可聚焦元素的相对位置自动应用定向导航方案”。这些是适用于 Android 用户界面小部件的 navigation attributesnextFocusDownnextFocusLeftnextFocusRightnextFocusUp
  • 嘿@MαπμQμαπkγVπ.0 感谢您的评论,但我对项目的导航没有任何问题。我需要焦点项目始终位于第一个项目位置(行首),如第二张图片所示。

标签: android rows android-tv leanback


【解决方案1】:

如果您还希望行的最后一项出现在开头,请使用此 ListRowPresenter:

class FocusedItemAtStartListRowPresenter(focusZoomFactor: Int) : ListRowPresenter(focusZoomFactor) {
    override fun createRowViewHolder(parent: ViewGroup): RowPresenter.ViewHolder {
        val viewHolder = super.createRowViewHolder(parent)

        with((viewHolder.view as ListRowView).gridView) {
            windowAlignment = BaseGridView.WINDOW_ALIGN_LOW_EDGE
            windowAlignmentOffsetPercent = 0f
            windowAlignmentOffset = parent.resources.getDimensionPixelSize(R.dimen.lb_browse_padding_start)
            itemAlignmentOffsetPercent = 0f
        }

        return viewHolder
    }
}

这类似于 Leanback Launcher 所做的。

【讨论】:

  • 非常感谢您的回复,我已经有一段时间没有问过了,现在无法查看它,但希望它有效并且对未来的求职者有所帮助:)
  • 谢谢!它有效:) 但你能补充一些解释吗?
  • @user3210008 如何对行做同样的事情,比如当我们向下滚动时,第二行移动到第一行位置。非常感谢。
  • @Akhilesh Dhar Dubey 您可以使用 RowsSupportFragment.setAlignment() 来做到这一点。
  • @Akhilesh Dhar Dubey 不客气 :) 我通过反编译 Leanback 启动器找到了原始问题的答案。至于你的问题的答案,我真的不记得我是如何发现它的,但我想我是在查看 RowsSupportFragment 的可用方法时偶然发现的。
【解决方案2】:

遇到同样的问题并通过使用自定义 ListRowPresenter 解决了它:

override fun createRowViewHolder(parent: ViewGroup): RowPresenter.ViewHolder {
        val viewHolder = super.createRowViewHolder(parent)

        val itemWidth = parent.resources.getDimensionPixelSize(R.dimen.epg_program_width)

        with((viewHolder as ListRowPresenter.ViewHolder).gridView) {
            itemAlignmentOffset = parent.width / 2 - itemWidth / 2 - paddingLeft
        }

        return viewHolder
    }

【讨论】:

    【解决方案3】:

    要成为完整的 tvlauncher,您还需要设置以下内容:

    fadingLeftEdge = true // to fade previous item out
    

    但更好的是使用他们的 FadingEdgeContainer,因为褪色边缘并不完全相同。

    类似这样的:https://github.com/bosphere/Android-FadingEdgeLayout

    【讨论】:

      【解决方案4】:

      你可能想试试这个方法:

      void setSelectedPositionSmooth (int position)
      

      Reference

      【讨论】:

      • 感谢您的回答,但这不是我想要的,我需要重点项目“来到”行的开头,到第一个项目的位置。而不是像第一张图片那样将焦点放在中间。
      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 2018-08-27
      • 2016-07-16
      • 2017-01-07
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2015-04-29
      相关资源
      最近更新 更多