有人知道如何实现标题中的问题吗?目标是避免当点击标题后,Leanback应用程序缩放到行项目时导致标题栏消失的动画。
BrowseSupportFragment的setHeadersState并没有起作用。也许与在OnHeaderClickedListener期间劫持startHeadersTransitionInternal有关?如果是这样,有任何想法如何正确实现吗?
有人知道如何实现标题中的问题吗?目标是避免当点击标题后,Leanback应用程序缩放到行项目时导致标题栏消失的动画。
BrowseSupportFragment的setHeadersState并没有起作用。也许与在OnHeaderClickedListener期间劫持startHeadersTransitionInternal有关?如果是这样,有任何想法如何正确实现吗?
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
。
需要注意的一点是,我发现这样做之后按下返回按钮将不再自动回到上一个行的标题,所以你需要手动操作。除此之外,这个方法看起来完全可行。
根据 @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();
}
如果您想要“禁用”滑入/滑出动画,可以重写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
}
}