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

时间:2019-01-08 23:55:14

标签: android-tv leanback

有人知道如何解决标题中的问题吗?目的是避免单击标题后,随着Leanback应用程序放大行项目,导致标题栏消失的动画。

BrowseSupportFragment的

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

2 个答案:

答案 0 :(得分:0)

所以这一个问题是,转换是由方法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.
    }
}

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

我发现与此有关的一件事是后退按钮将不再重新调整其中一行的标题,因此您必须手动进行。除此之外,似乎还可以。

答案 1 :(得分:0)

在@MichaelCeley的响应之后,并基于startHeadersTransitionInternal中原始的BrowseSupportFragment方法,该实现还可以使Backstack和侦听器保持工作。

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