android - Leanback BrowseFragment isShowingHeader() 方法行为
问题描述
我正在为电视创建一个应用程序。
我的问题是当我从电视遥控器按下右键并从标题片段导航到适配器的第一项 GridFragment(VerticalGridSupportFragment) 时,Leanback 库中的函数 isShowingHeaders() 返回 true。
即使当时我的 HeaderFragment 是隐藏的或不可见的。
但是,如果我从 header-fragment 导航到 RowSupportFragment 第一项行为符合预期,即方法 isShowingHeaders() 返回 false。
请在下面找到代码
public class PageAndListRowFragment extends BrowseSupportFragment {
private static final long HEADER_ID_1 = 1;
private static final String HEADER_NAME_1 = "Page Fragment";
private static final long HEADER_ID_2 = 2;
private static final String HEADER_NAME_2 = "Rows Fragment";
private static final long HEADER_ID_3 = 3;
private BackgroundManager mBackgroundManager;
private ArrayObjectAdapter mRowsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupUi();
loadData();
mBackgroundManager = BackgroundManager.getInstance(getActivity());
mBackgroundManager.attach(getActivity().getWindow());
getMainFragmentRegistry().registerFragment(PageRow.class,
new PageRowFragmentFactory(mBackgroundManager));
}
private void setupUi() {
setHeadersState(HEADERS_ENABLED);
setHeadersTransitionOnBackEnabled(true);
setBrandColor(getResources().getColor(R.color.fastlane_background));
setTitle("Title goes here");
setOnSearchClickedListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
prepareEntranceTransition();
}
private void loadData() {
mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
setAdapter(mRowsAdapter);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
createRows();
startEntranceTransition();
}
}, 2000);
}
@Override
public boolean isInHeadersTransition() {
boolean header_shown1=super.isInHeadersTransition();
Log.e("header_shown1",header_shown1+"val12");
isShowingHeaders();
return header_shown1;
}
@Override
public boolean isShowingHeaders() {
boolean header_shown=super.isShowingHeaders();
Log.e("header_shown",header_shown+"val12");
return header_shown;
}
private void createRows() {
HeaderItem headerItem1 = new HeaderItem(HEADER_ID_1, HEADER_NAME_1);
PageRow pageRow1 = new PageRow(headerItem1);
mRowsAdapter.add(pageRow1);
HeaderItem headerItem2 = new HeaderItem(HEADER_ID_2, HEADER_NAME_2);
PageRow pageRow2 = new PageRow(headerItem2);
mRowsAdapter.add(pageRow2);
}
private static class PageRowFragmentFactory extends BrowseSupportFragment.FragmentFactory {
private final BackgroundManager mBackgroundManager;
PageRowFragmentFactory(BackgroundManager backgroundManager) {
this.mBackgroundManager = backgroundManager;
}
@Override
public Fragment createFragment(Object rowObj) {
Row row = (Row)rowObj;
mBackgroundManager.setDrawable(null);
if (row.getHeaderItem().getId() == HEADER_ID_1) {
return new SampleFragmentA();
} else if (row.getHeaderItem().getId() == HEADER_ID_2) {
return new SampleFragmentB();
}
throw new IllegalArgumentException(String.format("Invalid row %s", rowObj));
}
}
public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragmentA> {
public PageFragmentAdapterImpl(SampleFragmentA fragment) {
super(fragment);
}
}
/**
* Simple page fragment implementation.
*/
public static class SampleFragmentA extends VericalGridSupportFragment {
private static final int COLUMNS = 4;
private final int ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_SMALL;
private ArrayObjectAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupAdapter();
loadData();
getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter());
}
private void setupAdapter() {
VerticalGridPresenter presenter = new VerticalGridPresenter(ZOOM_FACTOR);
presenter.setNumberOfColumns(COLUMNS);
setGridPresenter(presenter);
CardPresenterSelector cardPresenter = new CardPresenterSelector(getActivity());
mAdapter = new ArrayObjectAdapter(cardPresenter);
setAdapter(mAdapter);
setOnItemViewClickedListener(new OnItemViewClickedListener() {
@Override
public void onItemClicked(
Presenter.ViewHolder itemViewHolder,
Object item,
RowPresenter.ViewHolder rowViewHolder,
Row row) {
Card card = (Card)item;
}
});
}
private void loadData() {
String json = Utils.inputStreamToString(getResources().openRawResource(
R.raw.grid_example));
CardRow cardRow = new Gson().fromJson(json, CardRow.class);
mAdapter.addAll(0, cardRow.getCards());
}
}
/**
* Page fragment embeds a rows fragment.
*/
public static class SampleFragmentB extends RowsSupportFragment {
private final ArrayObjectAdapter mRowsAdapter;
public SampleFragmentB() {
mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector());
setAdapter(mRowsAdapter);
setOnItemViewClickedListener(new OnItemViewClickedListener() {
@Override
public void onItemClicked(
Presenter.ViewHolder itemViewHolder,
Object item,
RowPresenter.ViewHolder rowViewHolder,
Row row) {
}
});
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createRows();
getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter());
}
private void createRows() {
String json = Utils.inputStreamToString(getResources().openRawResource(
R.raw.page_row_example));
CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
for (CardRow row : rows) {
if (row.getType() == CardRow.TYPE_DEFAULT) {
mRowsAdapter.add(createCardRow(row));
}
}
}
private Row createCardRow(CardRow cardRow) {
PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
for (Card card : cardRow.getCards()) {
adapter.add(card);
}
HeaderItem headerItem = new HeaderItem(cardRow.getTitle());
return new CardListRow(headerItem, adapter, cardRow);
}} }
解决方案
推荐阅读
- python - 如何在 pytest 中通过测试?
- node.js - 错误:在 Heroku 中找不到模块“猫鼬”
- django - 在 django 中使用外键的 _set() 和 filter() 有什么区别?
- c - 不能运行简单的功能程序
- kubernetes - 记忆时服务帐户名称不会“粘”到 Argo 工作流程
- git - 如何只克隆`.git`目录?
- c++ - 使用我在 Paint 中绘制的纹理有问题吗?
- node.js - 我应该如何将秘密环境变量传递给 Elastic Beanstalk 上的 Docker 应用程序?
- python - 我如何实际验证给定 url 的 SSL 证书?
- css - 在标题元素上使用剪辑路径时,z 索引不适用于图像