如何缩小无缩放效果BrowseFragment两行间的多余间距?
解决BrowseFragment无缩放时Row首尾多余间距的问题
我之前也碰到过这个问题——关闭缩放效果后,BrowseFragment里相邻两行的首尾之间会出现莫名的多余间距,直接覆盖系统维度参数有时候确实不生效,试试下面这几个方案:
1. 优先尝试覆盖Leanback的系统维度参数
Leanback库本身定义了控制Row间距的维度值,你需要在自己项目的dimens.xml文件里同名覆盖这些值,注意要放在适配Android TV的资源目录(比如values-v21)下,确保优先级高于库自带的资源:
<!-- 控制Row与Row之间的垂直间距 --> <dimen name="leanback_row_vertical_spacing">6dp</dimen> <!-- 控制单个Row内容区的上下内边距 --> <dimen name="leanback_row_content_padding_top">3dp</dimen> <dimen name="leanback_row_content_padding_bottom">3dp</dimen>
如果之前覆盖没生效,检查下是不是维度名称写错了,或者资源目录的优先级不对。
2. 自定义ListRowPresenter来精确控制间距
如果覆盖维度还是没效果,那可以直接自定义Row的渲染Presenter,手动设置间距:
class CustomListRowPresenter : ListRowPresenter() { override fun onCreateViewHolder(parent: ViewGroup): Presenter.ViewHolder { val viewHolder = super.onCreateViewHolder(parent) // 设置Row之间的垂直间距 setRowVerticalSpacing(parent.resources.getDimensionPixelSize(R.dimen.custom_row_spacing)) // 调整Row内部的上下内边距 val rowView = viewHolder.view as ListRowView rowView.setPadding( rowView.paddingLeft, parent.resources.getDimensionPixelSize(R.dimen.custom_row_padding_top), rowView.paddingRight, parent.resources.getDimensionPixelSize(R.dimen.custom_row_padding_bottom) ) return viewHolder } }
然后在给BrowseFragment设置Adapter时,指定使用这个自定义Presenter:
val browseAdapter = object : ArrayObjectAdapter() { override fun getPresenter(item: Any): Presenter { return if (item is ListRow) { CustomListRowPresenter() } else { super.getPresenter(item) } } } browseFragment.adapter = browseAdapter
3. 直接操作内部的VerticalGridView
BrowseFragment内部是用VerticalGridView来承载所有Row的,你可以直接找到这个View并设置它的垂直间距:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 找到Leanback内部的VerticalGridView val verticalGridView = view.findViewById<VerticalGridView>(R.id.browse_rows) verticalGridView?.apply { setVerticalSpacing(resources.getDimensionPixelSize(R.dimen.custom_row_spacing)) } }
这个方法比较直接,适合快速调试间距效果。
内容的提问来源于stack exchange,提问作者Uniruddh
相关产品推荐
相关产品推荐

