【发布时间】:2015-11-30 20:34:34
【问题描述】:
在为 Android TV 开发应用程序时,我遇到了使用 Leanback 支持库提供的 BrowseFragment 的问题。 我们可以更改 RowsFragment 项之间的边距吗?
【问题讨论】:
-
填充元素是一种解决方案吗?
-
感谢您的快速回复,我终于找到了解决方案。
标签: android android-tv
在为 Android TV 开发应用程序时,我遇到了使用 Leanback 支持库提供的 BrowseFragment 的问题。 我们可以更改 RowsFragment 项之间的边距吗?
【问题讨论】:
标签: android android-tv
我自己找到了答案。关键是 HorizontalGridView,它存储每行项目列表。我们可以通过 R.id.row_content 得到这个 HorizontalGridView 的引用。最后,setItemMargin 方法是解决这个问题的方法。 下面是一个示例代码,我可以得到顶部图像。
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
HorizontalGridView horizontalGridView = (HorizontalGridView) parent.findViewById(R.id.row_content);
horizontalGridView.setItemMargin(400); // You can set item margin here.
...
};
【讨论】:
((ViewGroup.MarginLayoutParams) horizontalGridView.getLayoutParams()).setMargins(0, 0, 0, 100); 可以自己改变horizontalGridView的margin。
您可以覆盖一些样式来实现这一点,例如:
<style name="AppTheme.Leanback" parent="Theme.Leanback">
..
<item name="rowHorizontalGridStyle">@style/TvHorizontalGridView</item>
..
</style>
<style name="TvHorizontalGridView" parent="Widget.Leanback.Row.HorizontalGridView">
<item name="horizontalMargin">@dimen/margin_medium</item>
<item name="verticalMargin">@dimen/margin_medium</item>
</style>
其中@dimen/margin_medium 是您想要的边距大小。
【讨论】:
最好覆盖@Billy 回答的样式细节。不幸的是,可能需要一段时间才能弄清楚是什么。如果您要查找的内容不可样式化,您显然可以覆盖内置的leanback 资源(但不确定是否可靠/安全)。例如:
<dimen name="lb_browse_rows_margin_top">167dp</dimen>
<dimen name="lb_browse_item_vertical_spacing">8dp</dimen>
<dimen name="lb_browse_expanded_row_no_hovercard_bottom_padding">28dp</dimen>
【讨论】:
我有一个案例需要在 ListRow 中实现无限滚动。此外,我需要在每个最后一项之后添加额外的空间。所以我通过向适配器的 PresenterSelector 添加自定义 Presenter 来解决这个问题:
class EmptySpacePresenter : Presenter() {
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
val emptySpaceView = FrameLayout(parent.context).apply {
val width = context.resources.getDimension(R.dimen.gallery_carousel_horizontal_gap).toInt()
layoutParams = FrameLayout.LayoutParams(width, FrameLayout.LayoutParams.MATCH_PARENT)
isClickable = false
isFocusable = false
isFocusableInTouchMode = false
}
return ViewHolder(emptySpaceView)
}
override fun onBindViewHolder(viewHolder: ViewHolder?, item: Any?) = Unit
override fun onUnbindViewHolder(viewHolder: ViewHolder?) = Unit
}
class MyObjectAdapter() : ArrayObjectAdapter() {
init {
presenterSelector = ClassPresenterSelector()
.addClassPresenter(ListItem::class.java, ListItemPresenter())
.addClassPresenter(EmptySpace::class.java, EmptySpacePresenter())
}
}
【讨论】: