Leanback for Android TV:取消设置视频标题会增加行间距

Posted

技术标签:

【中文标题】Leanback for Android TV:取消设置视频标题会增加行间距【英文标题】:Leanback for Android TV : Unsetting Video Title Increases Spacing between Rows 【发布时间】:2016-10-01 04:17:55 【问题描述】:

sample app 的 PlaybackOverlayFragment 使用 PlaybackControlsGlue 根据数据模型设置播放控件。这是使用标准胶水时的样子:

我的问题是我不希望标题/副标题文本出现在主播放器控制栏上方 - 我们希望它们出现在播放器屏幕的左上角。因此,为了禁用标题/副标题的显示,我覆盖了胶水的createControlsRowAndPresenter() 并使用了 PlaybackControlsRowPresenter 的空参数构造函数:

@Override
public PlaybackControlsRowPresenter createControlsRowAndPresenter() 
    PlaybackControlsRow controlsRow = new PlaybackControlsRow(this);
    setControlsRow(controlsRow);
    final View.OnKeyListener onKeyListener = this;
    PlaybackControlsRowPresenter presenter = new PlaybackControlsRowPresenter()  // no AbstractDetailsDescriptionPresenter argument
        @Override
        protected void onBindRowViewHolder(RowPresenter.ViewHolder vh, Object item) 
            super.onBindRowViewHolder(vh, item);
            vh.setOnKeyListener(onKeyListener);
        
        @Override
        protected void onUnbindRowViewHolder(RowPresenter.ViewHolder vh) 
            super.onUnbindRowViewHolder(vh);
            vh.setOnKeyListener(null);
        
    ;

    // secondaryActionsAdapter setup not shown
    presenter.setOnActionClickedListener(new OnActionClickedListener() 
        @Override
        public void onActionClicked(Action action) 
            dispatchAction(action);
        
    );

    return presenter;

结果?没有按预期显示标题/副标题,但现在主控件栏和其他行之间的间距更大:

我可能做错了什么,还是leanback 库的错误?

【问题讨论】:

【参考方案1】:

没有这两行文本,播放控件现在位于该视图的顶部。您可能可以对播放控件应用边距或填充,以将其移动到预期位置。

【讨论】:

【参考方案2】:

事实证明,播放控件需要在其上方有一些视图,这样它们就不会占据容器视图的顶部(@Nick 是对的)。但我想分享我的解决方案,以防有人有类似的需求。

PlaybackControlsRowPresenter 可以在其构造函数中接收任何演示者,而不仅仅是 AbstractDetailsDescriptionPresenters。所以 createControlsRowAndPresenter() 应该是这样的:

EmojiRowPresenter emojiRowPresenter = new EmojiRowPresenter() 
            @Override
            protected void onBindEmojiInfo(EmojiRowView rowView, EmojiInfo emojiInfo) 
                rowView.setEmojiInfo(emojiInfo);
            
        ;
PlaybackControlsRowPresenter presenter = new PlaybackControlsRowPresenter(emojiRowPresenter)  // replace the default description presenter with custom presenter
... 


// everything else stays as before

EmojiRowPresenter 是 Presenter 的子类,如下所示:

public abstract class EmojiRowPresenter extends Presenter 
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent) 
        EmojiRowView emojiRowView = new EmojiRowView(parent.getContext());
        emojiRowView.setFocusable(true);
        emojiRowView.setFocusableInTouchMode(true);
        return new ViewHolder(emojiRowView);
    

    @Override
    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) 
        EmojiRowView emojiRowView = (EmojiRowView) viewHolder.view;
        PlaybackControlHelper glue = (PlaybackControlHelper) item;
        EmojiInfo emojiInfo = glue.getEmojiInfo();
        if (emojiInfo != null) 
            onBindEmojiInfo(emojiRowView, emojiInfo);
        
    

    @Override
    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) 
        // ...
    

    protected abstract void onBindEmojiInfo(EmojiRowView rowView, EmojiInfo emojiInfo);

当然,EmojiRowView 从定义每个项目的布局创建视图。这是最终结果:

【讨论】:

以上是关于Leanback for Android TV:取消设置视频标题会增加行间距的主要内容,如果未能解决你的问题,请参考以下文章

简化 Android TV / Leanback 的登录

如何使用 Leanback 库在 Android TV 中创建顶部导航栏

Android TV 开发-->Leanback 中 VerticalGridSupportFragment 的使用

Android TV(leanback)中的持久标头片段(禁用动画)

使用 LeanBack 支持库自定义 Android TV 界面

Android TV 开发-->Leanback 中的 BrowseSupportFragment