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

Posted

技术标签:

【中文标题】Android TV(leanback)中的持久标头片段(禁用动画)【英文标题】:Persistent header fragment (disable animation) in Android TV (leanback) 【发布时间】:2019-06-03 17:08:31 【问题描述】:

有人知道如何实现标题中的问题吗?目的是避免在单击标题后导致标题栏消失的动画,因为 Leanback 应用程序会放大行项目。

setHeadersState 的 BrowseSupportFragment 没有帮助。也许与在 OnHeaderClickedListener 期间劫持 startHeadersTransitionInternal 有关?如果是这样,知道如何正确实现它吗?

【问题讨论】:

与***.com/questions/51977747/… 相同(未答复) 【参考方案1】:

所以这个问题在于转换是由包私有的方法startHeadersTransitionInternal处理的。因此,在大多数情况下您无法覆盖它。但是,由于它只是 package 私有而不是 private 私有,因此您可以做一些小技巧。

首先,在您的应用中创建一个包名称与BrowseSupportFragment 相同的包。然后在该包中创建一个扩展 BrowseSupportFragment 的类,并在没有实现的情况下覆盖有问题的方法。看起来像这样:

package android.support.v17.leanback.app; // Different for AndroidX

public class HackyBrowseSupportFragment extends BrowseSupportFragment 

    @Override
    void startHeadersTransitionInternal(boolean withHeaders) 
        // Do nothing. This avoids the transition.
    

那么,您应该扩展HackyBrowseSupportFragment,而不是扩展BrowseSupportFragment

我发现有一点需要注意的是,后退按钮将不再重新聚焦其中一行的标题,因此您必须手动执行此操作。除此之外,似乎工作得很好。

【讨论】:

我已经尝试了上述解决方案,它停止了 HeaderFragment 的动画,但是从 ListRow 项返回到 HeaderItem 时它没有获得焦点。任何建议如何处理这种情况 @ch3tanz 我在我的解决方案中确实注意到这将是一个问题。我没有深入研究这个问题,但如果你发布一个问题并将其链接到这里,那么我会在有时间的时候看看。 感谢@MichaelCeley,快速回复。这是链接 - ***.com/questions/60963864/…【参考方案2】:

根据@MichaelCeley 的响应并基于来自BrowseSupportFragment 的原始startHeadersTransitionInternal 方法,这个保持后台堆栈和侦听器的实现也可以工作。

@Override
void startHeadersTransitionInternal(final boolean withHeaders) 
    if (getFragmentManager().isDestroyed()) 
        return;
    
    if (!isHeadersDataReady()) 
        return;
    
    new Runnable() 
        @Override
        public void run() 
            if (mBrowseTransitionListener != null) 
                mBrowseTransitionListener.onHeadersTransitionStart(withHeaders);
            
            if (mHeadersBackStackEnabled) 
                if (!withHeaders) 
                    getFragmentManager().beginTransaction()
                            .addToBackStack(mWithHeadersBackStackName).commit();
                 else 
                    int index = mBackStackChangedListener.mIndexOfHeadersBackStack;
                    if (index >= 0) 
                        FragmentManager.BackStackEntry entry = getFragmentManager().getBackStackEntryAt(index);
                        getFragmentManager().popBackStackImmediate(entry.getId(),
                                FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    
                
            
        
    .run();

【讨论】:

以上是关于Android TV(leanback)中的持久标头片段(禁用动画)的主要内容,如果未能解决你的问题,请参考以下文章

Android TV 开发-->Leanback 中的 BrowseSupportFragment

Android TV Leanback Exoplayer 视频缩放问题

当我从一个菜单移动到另一个菜单并返回时,Leanback android Tv 中的 BrowseSupportFragment 会调用服务器

简化 Android TV / Leanback 的登录

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

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