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

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

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

【问题讨论】:

标签: android-tv leanback


【解决方案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,快速回复。这是链接 - stackoverflow.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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2016-05-31
    • 2021-03-04
    • 2021-08-12
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多