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