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();
}
谁知道标题中的问题是怎么实现的? 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();
}