去除Leanback VerticalGridFragment顶部间距

13

我正在使用VerticalGridFragment来以网格形式布局显示项目。 我不需要显示搜索或标题,并且我希望行从屏幕顶部开始,没有任何边距。 有什么建议吗?下面的图像示例


@jaydroider 我编辑了我的问题,请查看截图。 - nadine87
你的意思是要将这些行移动到顶部区域的正下方,对吗? - Jay Rathod
是的,我已经成功移除了TitleView部分并将其高度设置为0, 但我仍然无法找到一种方法将行向上移动。 - nadine87
你能告诉我这是你提供的全屏还是左侧项目也连接到行中?或者说在浏览片段中你只有这么多行。 - Jay Rathod
请按照我下面的答案操作,如果遇到任何问题,请告诉我。 - Jay Rathod
显示剩余4条评论
5个回答

13

我发现一种方法可以通过覆盖 VerticalGridFragmentVerticalGridPresenter 并获取 VerticalGridView,然后将顶部填充设置为较小的值来实现。

在扩展了 VerticalGridPresenterCustomVerticalGridPresenter 类中,覆盖此方法:

@Override
protected void initializeGridViewHolder(ViewHolder vh) {
    super.initializeGridViewHolder(vh);
    gridView = vh.getGridView();
    int top= 20;//this is the new value for top padding
    int bottom = gridView.getPaddingBottom();
    int right = gridView.getPaddingRight();
    int left = gridView.getPaddingLeft();
    gridView.setPadding(left,top,right,bottom);
}

然后在VerticalGridFragment中,将新的CustomVerticalGridPresenter分配如下:

 CustomVerticalGridPresenter gridPresenter = new CustomVerticalGridPresenter();
    gridPresenter.setNumberOfColumns(NUM_COLUMNS);
    setGridPresenter(gridPresenter);

是的,它可以工作。但你需要更好地解释你的答案。 - mehmoodnisar125

7

您需要创建一个名为CustomVerticalGridPresenter的新类,并将以下代码放入其中.

public class CustomVerticalGridPresenter extends VerticalGridPresenter {

    VerticalGridView gridView;

    CustomVerticalGridPresenter(int zoom, boolean val){
        super(zoom, val);
    }

    @Override
    protected void initializeGridViewHolder(ViewHolder vh) {
        super.initializeGridViewHolder(vh);
        gridView = vh.getGridView();
        int top = 20;//this is the new value for top padding
        int bottom = gridView.getPaddingBottom();
        int right = gridView.getPaddingRight();
        int left = gridView.getPaddingLeft();
        gridView.setPadding(left,top,right,bottom);
    }
}

然后在VerticalGridFragment类中使用:

CustomVerticalGridPresenter videoGridPresenter = new 
CustomVerticalGridPresenter(ZOOM_FACTOR, false);

替代

VerticalGridPresentervideoGridPresenter = new VerticalGridPresenter(ZOOM_FACTOR, false);

4
另一种解决此问题的方法是设置VerticalGridView的windowAlignment属性。最值得注意的是...
verticalGridView.windowAlignment = BaseGridView.WINDOW_ALIGN_LOW_EDGE //this will remove the top margin
verticalGridView.windowAlignmentOffset = 0
verticalGridView.windowAlignmentOffsetPercent = 25f //find correct values for your case

2

首先按照以下步骤将默认给定的边距上移,这是Lean back Library的功能。

1. 进入您的SDK。

2. 在SDK内 -> extras -> android -> support -> v17 -> leanback -> res -> values。

3. 在values文件夹中复制dimens.xml到当前项目中,然后将其复制到项目的res -> values文件夹中。

现在您的values文件夹中有dimens.xml文件。

现在打开您已复制的dimens.xml文件。

更改下面所定义属性的值。默认情况下,它会给出大约168dp,因此将其减小以减少顶部边距,如下所示。

<dimen name="lb_browse_rows_margin_top">35dp</dimen>

现在,您可以将行分割为顶部部分正下方的Browse Fragment。请注意保留HTML标签。

谢谢您的帮助,我正在尝试按照说明操作,但是我遇到了以下资源未找到的错误:android.view.InflateException: Binary XML file line #17: Error inflating class android.support.v17.leanback.widget.TitleView - nadine87
@nadine87,你能否编辑你的问题并在上面添加完整的Logcat信息,并说明你做了什么更改并引发了这个异常。因为这个dimen文件没有使用任何资源,你可能有其他不匹配的地方。 - Jay Rathod
不是这样的,它应该使用leanback布局,我没有做任何更改, 我只是将dimens文件添加到res/values中,并编辑它以添加我的自定义dimen值, 项目运行后会出现运行时异常。 我无法复制logcat,它太长了,无法适合此处注意:有两个类似的错误(Error inflating class android.support.v17.leanback.widget.TitleView和SearchOrbView) - nadine87
@nadine87 是的,它应该使用“Lean back layouts”,这就是为什么我在上面提到的异常不是因为dimen文件,而是因为其他原因。 dimen文件只是使用leanback提供的所有布局的dp值。我也有同样的问题,即从顶部显示行,我通过仅更改dimen文件中的dp值来解决了这个问题,没有做其他修改。 - Jay Rathod
这个解决方案可能有帮助,但对我没有起作用,我找到了正确的解决方案,请查看我的下一个答案。 - nadine87
它适用于浏览片段,但不适用于垂直网格片段。 - mehmoodnisar125

0
最好的方法是创建一个主题并将其设置为您的Activity / Fragment。
在themes.xml中:
<style name="AppTheme.Leanback.NoTitle" parent="Theme.Leanback.Browse">
    <item name="browseRowsMarginTop">@dimen/lb_browse_rows_margin_top_none</item>>
</style>

dimens.xml文件中

<dimen name="lb_browse_rows_margin_top_none">32dp</dimen>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接