Android开发 - BrowseFragment 类再TV开发中视频节目分类组列表解析

BrowseFragment是什么

  • 例如电视应用屏幕上有很多行,每行显示一组视频,比如“热门电影”、“新剧集”、“推荐给你”等。每行可以左右滚动,显示不同的视频缩略图。BrowseFragment 就是用来创建这种界面的

主要功能

  • 每行有一个标题:告诉你这行内容是什么,比如“热门电影”
  • 每行可以滚动:你可以左右滚动,看到更多的内容
  • 简单的导航:你可以很容易地在不同的行之间跳转

使用场景

  • BrowseFragment 常用于:

    • 视频应用展示不同类型的视频内容

    • 购物应用展示不同类别的商品

    • 新闻应用展示不同类型的新闻

代码举例

  • 假设我们要做一个简单的应用,显示三行内容每行有一个标题和一些项目

    • 创建主布局文件activity_main.xml

      <?xml version="1.0" encoding="utf-8"?>
      <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      
          <!-- BrowseFragment 容器 -->
          <fragment
              android:id="@+id/main_browse_fragment"
              android:name="androidx.leanback.app.BrowseFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
      </FrameLayout>
      
    • 自定义 CardPresenter 类CardPresenter.java

    • import android.view.ViewGroup;
      import android.widget.TextView;
      import androidx.leanback.widget.Presenter;
      
      public class CardPresenter extends Presenter {
      
          @Override
          public ViewHolder onCreateViewHolder(ViewGroup parent) {
              // 创建一个 TextView 作为每个项目的视图
              TextView textView = new TextView(parent.getContext());
              textView.setLayoutParams(new ViewGroup.LayoutParams(
                      ViewGroup.LayoutParams.WRAP_CONTENT,
                      ViewGroup.LayoutParams.WRAP_CONTENT
              ));
              textView.setPadding(10, 10, 10, 10); // 设置内边距
              return new ViewHolder(textView); // 返回 ViewHolder,包含视图
          }
      
          @Override
          public void onBindViewHolder(ViewHolder viewHolder, Object item) {
              // 将项目的数据绑定到 TextView
              ((TextView) viewHolder.view).setText((String) item);
          }
      
          @Override
          public void onUnbindViewHolder(ViewHolder viewHolder) {
              // 清理资源(如果有需要的话)
              // 在这里我们不需要做任何事情,因为我们没有资源需要清理
          }
      }
      
    • 启动类

      import android.os.Bundle;
      import androidx.fragment.app.FragmentActivity;
      import androidx.leanback.app.BrowseFragment;
      import androidx.leanback.widget.ArrayObjectAdapter;
      import androidx.leanback.widget.ListRow;
      import androidx.leanback.widget.ListRowPresenter;
      import androidx.leanback.widget.HeaderItem;
      
      public class MainActivity extends FragmentActivity {
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main); // 设置布局文件'activity_main'作为主活动的界面
      
              // 如果这是第一次创建活动,添加我们的自定义 BrowseFragment
              if (savedInstanceState == null) {
                  //使用 Fragment 管理器将 MyBrowseFragment 替换到 main_browse_fragment 容器中
                  getSupportFragmentManager().beginTransaction()
                      .replace(R.id.main_browse_fragment, new MyBrowseFragment())
                      .commitNow(); // 提交事务,立即执行
              }
          }
      
          // 自定义的 BrowseFragment 类,用于显示内容
          public static class MyBrowseFragment extends BrowseFragment {
      
              @Override
              public void onActivityCreated(Bundle savedInstanceState) {
                  super.onActivityCreated(savedInstanceState);
                  setupUIElements(); // 设置界面元素,例如标题
                  loadRows(); // 加载数据行并显示在界面上
              }
              
      		//调用方法来设置界面元素,例如设置标题
              private void setupUIElements() {
                  // 设置屏幕顶部的标题:设置屏幕顶部的标题为“BrowseFragment 示例”
                  setTitle("BrowseFragment 示例");
              }
      
              //调用方法来加载数据行并显示在界面上
              private void loadRows() {
                  // 创建一个适配器来存储管理我们的数据行,每行都是一个 ListRow
                  ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
      
                  // 定义三个类别,每个类别将显示一行
                  String[] categories = {"类别 1", "类别 2", "类别 3"};
                  //遍历每个类别,创建和添加数据行
                  for (int i = 0; i < categories.length; i++) {
                      // 每个类别都有一个标题:为每个类别创建一个标题项
                      HeaderItem header = new HeaderItem(i, categories[i]);
      
                      // 创建一个适配器来存储每行的项目
                      ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
                      for (int j = 0; j < 10; j++) {
                          // 添加项目到每行中,例如 "项目 0", "项目 1"
                          listRowAdapter.add("项目 " + j);
                      }
      
                      // 将这一行添加到总的适配器中,包含标题和项目
                      rowsAdapter.add(new ListRow(header, listRowAdapter));
                  }
      
                  // 设置适配器到 BrowseFragment,以显示内容
                  setAdapter(rowsAdapter);
              }
          }
      }
      
    • 创建清单文件AndroidManifest.xml

      <!--
        AndroidManifest.xml 是每个 Android 应用的配置文件,用于声明应用的基本信息、组件、权限和硬件特性等。
        这个文件是系统识别和管理应用的重要依据。
      -->
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.browsefragmentexample"> <!-- 应用包名,唯一标识该应用 -->
      
          <!-- 
            <application> 元素包含应用的全局配置和声明的组件(如活动、服务、接收器等)。
            它定义了应用的基本属性和行为。
          -->
          <application
              android:allowBackup="true" <!-- 允许应用数据备份 -->
              android:label="@string/app_name" <!-- 应用名称,显示在启动器中 -->
              android:theme="@style/Theme.Leanback"> <!-- 应用主题,使用 Leanback 库的主题 -->
      
              <!-- 
                <activity> 元素声明一个活动(Activity)。
                活动是用户可以与之交互的界面组件。
              -->
              <activity android:name=".MainActivity"> <!-- 定义 MainActivity 类为该活动 -->
      
                  <!-- 
                    <intent-filter> 元素用于声明该活动响应的意图(Intent)。
                    意图过滤器决定了哪些意图可以启动该活动。
                  -->
                  <intent-filter>
                      <!-- 
                        MAIN 行为表示这是一个主入口活动,当应用启动时,会启动这个活动。
                      -->
                      <action android:name="android.intent.action.MAIN" />
                      
                      <!-- 
                        LAUNCHER 类别表示该活动会出现在启动器中。
                        这使得它成为应用的启动活动。
                      -->
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
      
          </application>
      
      </manifest>
      

    总结

    • BrowseFragment 是一个方便的工具,可以帮助你在电视应用中展示分组内容。通过这个示例代码,你可以很容易地理解如何设置和使用 BrowseFragment,并且通过详细的注释,了解每一行代码的作用
posted @ 2024-08-02 20:39  阿俊学JAVA  阅读(20)  评论(0编辑  收藏  举报