Android開發 - BrowseFragment 類解析

阿俊学JAVA發表於2024-08-02

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,並且透過詳細的註釋,瞭解每一行程式碼的作用

相關文章