首页 > 其他分享 >Android开发 - BrowseFragment 类解析

Android开发 - BrowseFragment 类解析

时间:2024-08-02 20:39:17浏览次数:11  
标签:BrowseFragment 每行 androidx import new Android 解析 public

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

标签:BrowseFragment,每行,androidx,import,new,Android,解析,public
From: https://www.cnblogs.com/ajunjava/p/18339564

相关文章

  • Android开发 - RecyclerView 类详解
    什么是RecyclerViewRecyclerView是Android的一个控件,用来展示长列表或网格的内容,它比以前的ListView更加灵活和高效列表展示:想象你在手机上浏览一个长长的商品列表或图片网格。RecyclerView就是用来展示这样的内容的控件高效显示:如果你有一万件商品,RecyclerView不会一......
  • 深入解析与实战:解决 npm ERR! network ‘proxy‘ 配置问题
    在日常的前端开发工作中,使用npm(NodePackageManager)进行依赖管理已经成为了常态。然而,在某些情况下,我们可能会遇到网络配置问题导致的错误信息,比如npmERR!network'proxy'configissetproperly。本文将详细介绍如何解决这一问题,并通过实际案例演示正确的配置方法。......
  • Android 11 关于按键拦截/按键事件处理分享
    系统在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java处理按键事件,不管是物理按键还是SystemUI的nav_bar上的虚拟按键(使用了KeyEvent类中的,比如:KeyEvent.KEYCODE_VOLUME_UP).主要注意的有两个函数:interceptKeyBeforeDispatching......
  • Android 自定义图片拖动、缩放、旋转
    Android图片拖动、缩放、旋转图片拖动定义一个类,继承AppCompatImageViewpublicclassMyImageViewextendsAppCompatImageView{//实现方法publicMyImageView(Contextcontext){this(context,null);}//实现方法publicMyImageView(Cont......
  • Android开发 - (适配器)Adapter类中ArrayObjectAdapter实现类详细解析
    简介用于AndroidTV的Leanback库,用于绑定对象数组到UI组件具体作用ArrayObjectAdapter是RecyclerView和Adapter系列中用于处理列表数据的一种适配器类型,主要用于AndroidTV的Leanback库中的BrowseFragment、DetailFragment和PlaybackOverlayFragment等......
  • VS2019: LNK2019 无法解析的外部符号 __imp__invalid_parameter
    VS2019开发一个项目,报错:如下,errorLNK2001:unresolvedexternalsymbol__imp___CrtDbgReport errorLNK2001:unresolvedexternalsymbol__imp___invalid_parametererrorLNK2001:unresolvedexternalsymbol__imp___CrtDbgReportW errorLNK2001:unresolvedexterna......
  • Java计算机毕业设计基于Android的自闭症康复训练APP设计与实现(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景自闭症,作为一种复杂的神经发育障碍,影响着全球数百万儿童及其家庭。自闭症患者在社交互动、沟通表达及行为模式上常表现出显著困难。随着移动技术的飞......
  • 深度解析:中国二手电脑市场的产业链与经营模式
    一、行业简述(一)行业概念二手电脑市场是指销售、回收、维修和租赁使用过的电脑及相关配件的市场。这些二手电脑通常来源于消费者、企业、政府或其他组织的更新换代或淘汰设备。二手电脑市场为消费者和企业提供了经济实惠的购买选择,同时也促进了资源的循环利用。(二)行业特点......
  • 学习Android-2024-08
    学习Android-2024-08-01今天内容没有具体在程序中验证,可能存在问题。明天验证。1.打印日志1.1共5个级别,Log.e、Log.w、Log.i、Log.d、Log.v,重要性依次降低。例如Log.v会看到前面Log.e、Log.w等所有的信息。而Log.e只会看到Log.e的信息。1.2输出时打的tag,利于在控制台进行搜索......
  • 人工智能深度学习系列—深度学习损失函数中的Focal Loss解析
    文章目录1.背景介绍2.Loss计算公式3.使用场景4.代码样例5.总结1.背景介绍在深度学习的目标检测任务中,类别不平衡问题一直是提升模型性能的拦路虎。FocalLoss损失函数应运而生,专为解决这一难题设计。本文将深入探讨FocalLoss的背景、计算方法、应用场景以及如......