我正在为Android TV开发一个应用程序,但在使用提供的Leanback支持库中的BrowseFragment时遇到了问题。 我们可以更改RowsFragment中项目之间的间距吗?
我正在为Android TV开发一个应用程序,但在使用提供的Leanback支持库中的BrowseFragment时遇到了问题。 我们可以更改RowsFragment中项目之间的间距吗?
我自己找到了答案。关键是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 自身的边距。 - corochann您可以覆盖一些样式来实现这个目标,例如:
<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>
class TVPresenter() : Presenter() {
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
parent.findViewById<HorizontalGridView>(R.id.row_content).run {
setItemSpacing(10)
setPadding(40,10,40,10)
}
val cardViewLayout = LayoutInflater.from(parent.context)
.inflate(R.layout.item_layout, parent, false)
return ViewHolder(cardViewLayout)
}
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())
}
}