3. 使用 BrowseFragment 构建电视主浏览页

使用 BrowseFragment 构建电视主浏览页 学习卡片

BrowseFragment 的页面骨架与职责划分

Leanback 的 BrowseFragment 不是普通 Fragment,它内部已经预置了电视主浏览页的三段式结构:左侧品牌区(Branding)、顶部搜索入口(SearchAffordance)、右侧内容行(RowsFragment)。开发者要做的是通过 setHeadersState、setBrandTitle、setOnSearchClickedListener 和 setAdapter 把这三块“填满”,而不是自己从零拼布局。

电视屏幕(横屏 1920×1080 逻辑区域) 品牌区 Branding setBrandTitle() setBrandColor() setBadgeDrawable() 显示应用名/Logo 不可聚焦 搜索入口 SearchAffordance setOnSearchClickedListener() → 跳转 SearchFragment 内容行区域 RowsFragment Header 1:推荐 ← D-pad 左右切换卡片 Header 2:电影 ← D-pad 上下切换行 Header 3:电视剧 焦点从品牌区→搜索→行标题→卡片,D-pad 方向键驱动

关键配置代码

在 onCreate 或 onActivityCreated 中完成以下四步配置,即可得到一个可交互的电视主浏览页骨架:

public class MainBrowseFragment extends BrowseFragment {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // 1. 品牌区:显示应用名,隐藏默认图标
        setBrandTitle("电视应用实战");
        setBrandColor(Color.parseColor("#1A73E8"));
        setBadgeDrawable(null);

        // 2. 搜索入口:点击后跳转搜索页
        setOnSearchClickedListener(v -> {
            Intent intent = new Intent(getActivity(), SearchActivity.class);
            startActivity(intent);
        });

        // 3. 头部显示模式:左侧显示分类标题
        setHeadersState(HEADERS_ENABLED);
        setHeadersTransitionOnBackEnabled(true);

        // 4. 内容行适配器(本例先用空适配器验证骨架)
        ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
        setAdapter(rowsAdapter);
    }
}
验证要点:运行后按遥控器方向键,观察焦点是否按“品牌区→搜索→行标题→卡片”的顺序移动;按返回键时,若当前在内容行内,应回到行标题层级而非直接退出应用。

遥控器交互验证清单

按键预期行为观察点
D-pad 下焦点从搜索入口进入第一行标题行标题高亮,卡片行整体上移
D-pad 右焦点在卡片间向右移动卡片边框高亮,行不滚动
D-pad 上焦点从行标题回到搜索入口搜索图标获得焦点态
确认键触发搜索入口点击跳转到 SearchActivity
返回键从内容行回到行标题层级不直接退出应用
常见问题:若搜索入口不显示,检查是否调用了 setOnSearchClickedListener;若品牌区文字不显示,确认 setBrandTitle 在 setAdapter 之前调用。Leanback 的 BrowseFragment 要求主题为 Theme.Leanback.Browse,否则布局会异常。