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

7

有人知道如何实现标题中的问题吗?目标是避免当点击标题后,Leanback应用程序缩放到行项目时导致标题栏消失的动画。

BrowseSupportFragment的setHeadersState并没有起作用。也许与在OnHeaderClickedListener期间劫持startHeadersTransitionInternal有关?如果是这样,有任何想法如何正确实现吗?


同 https://stackoverflow.com/questions/51977747/android-tv-disable-header-fragment-animation-hide-leanback-library(未回答) - Mondego
3个回答

4
这个问题在于转换由方法startHeadersTransitionInternal处理,该方法是包可见的。因此,在大多数情况下,您无法覆盖它。但是,由于它仅仅是包私有而不是私有私有,有一个小技巧可以解决这个问题。
首先,在您的应用程序中创建一个与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

需要注意的一点是,我发现这样做之后按下返回按钮将不再自动回到上一个行的标题,所以你需要手动操作。除此之外,这个方法看起来完全可行。


我已尝试了上述解决方案,它停止了HeaderFragment的动画,但是在从ListRow项目返回到HeaderItem时它没有获得焦点。有什么建议如何处理这种情况? - ch3tanz
@ch3tanz,我在我的解决方案中指出了这将是一个问题。我还没有深入研究这个问题,但如果你发表一个问题并在这里链接它,那么当我有时间时我会去看一下的。 - Michael Celey
感谢@MichaelCeley的快速回复。这是链接-https://stackoverflow.com/questions/60963864/how-to-set-headeritem-on-the-left-side-using-verticalgridview-like-android-tv-ho - ch3tanz

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

0

如果您想要“禁用”滑入/滑出动画,可以重写BrowseSupportFragment.onCreateView()函数,并将mSceneWithHeaders的值赋给mSceneWithoutHeaders。这样,过渡仍然会运行,但不会更改布局,保持正确的焦点行为。

为此,您仍需要覆盖片段的包。代码应如下所示:

@file:Suppress("PackageDirectoryMismatch")

package androidx.leanback.app;


class MyBrowseSupportFragment : BrowseSupportFragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mSceneWithoutHeaders = mSceneWithHeaders
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接