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,并且通过详细的注释,了解每一行代码的作用
-