Android 电视中的持续 header 片段(禁用动画)(leanback)

Persistent header fragment (disable animation) in Android TV (leanback)

谁知道标题中的问题是怎么实现的? objective 是为了避免在单击 Header 后 Leanback 应用程序放大行项目时导致 Headers 栏消失的动画。

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

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

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

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.
    }
}

然后,不是扩展 BrowseSupportFragment,而是扩展 HackyBrowseSupportFragment

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

根据@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();
}