ไลบรารีชุดเครื่องมือ Leanback UI

สร้างสิ่งที่ดีขึ้นด้วย Compose
สร้าง UI ที่สวยงามด้วยโค้ดที่น้อยที่สุดโดยใช้ Jetpack Compose สำหรับ Android TV OS

ชุดเครื่องมือ UI ของ Leanback ที่เลิกใช้แล้วมีไลบรารีเฉพาะสำหรับทีวีบางรายการที่ใช้ได้กับแอปที่พัฒนาขึ้นสำหรับ Android TV OS เท่านั้น ไลบรารีเหล่านี้ประกอบด้วยรายการต่อไปนี้

  • ไลบรารี Leanback: มีเทมเพลต UI ที่ ช่วยให้การสร้างแอป Android TV ง่ายขึ้น
  • ไลบรารี การตั้งค่า Leanback: มีหน้าจอการตั้งค่าและค่ากำหนดที่สอดคล้องกับ แพลตฟอร์ม แต่สามารถกำหนดธีมให้เข้ากับแอปได้
  • ไลบรารีการแบ่งหน้า Leanback: รองรับ โมเดลการแบ่งหน้า AndroidX สำหรับ ObjectAdapters ซึ่งมักใช้กับ เทมเพลต Leanback
  • ไลบรารี แท็บ Leanback: รองรับการนำทางแบบแท็บ ใน Android TV

ไลบรารีการแบ่งหน้า Leanback

การแบ่งหน้าภายในชุดเครื่องมือ UI ของ Leanback ทำงานเหมือนกับไลบรารีการแบ่งหน้า AndroidX เวอร์ชัน 3 ซึ่ง ช่วยให้การเพิ่มการแบ่งหน้าลงใน RecyclerView.Adapterง่ายขึ้น ไลบรารีการแบ่งหน้า Leanback มักจะแสดงอะแดปเตอร์เป็น ObjectAdapter แทน ดังนั้นไลบรารีจึงเพิ่มการรองรับการแบ่งหน้าลงใน ObjectAdapter

หากต้องการเพิ่มอะแดปเตอร์เพจจิ้งลงในแอป ให้เพิ่มทรัพยากร Dependency ของไลบรารีลงในโปรเจ็กต์ก่อน

implementation "androidx.leanback:leanback-paging:$version"

จากนั้นทำตาม เอกสารประกอบเพจจิ้งเวอร์ชัน 3 โดยใช้ androidx.leanback.paging.PagingDataAdapter แทน androidx.paging.PagingDataAdapter ความแตกต่างเพียงอย่างเดียวคือตอนนี้คุณสามารถ ส่ง Presenter หรือ PresenterSelectorได้แล้ว ซึ่งจะทำงานได้ทุกที่ที่คุณใช้ ObjectAdapter ตามปกติ เช่น ใน ListRow

Kotlin

val adapter: PagingDataAdapter<MyItem> = PagingDataAdapter(myPresenter,
   object : DiffUtil.ItemCallback<MyItem>() {
       override fun areItemsTheSame(
           oldItem: MyItem,
           newItem: MyItem
       ): Boolean {
           return oldItem.id === newItem.id
       }

       override fun areContentsTheSame(
           oldItem: MyItem,
           newItem: MyItem
       ): Boolean {
           return oldItem == newItem
       }
   })

val header = HeaderItem(headerTitle)
val row = ListRow(header, adapter)

Java

PagingDataAdapter<MyItem> adapter = new PagingDataAdapter(myPresenter, new DiffUtil.ItemCallback<MyItem>() {
    @Override
    public boolean areItemsTheSame(@NonNull MyItem oldItem, @NonNull MyItem newItem) {
        return oldItem.getId().equals(newItem.getId());
    }

    @Override
    public boolean areContentsTheSame(@NonNull MyItem oldItem, @NonNull MyItem newItem) {
        return oldItem.equals(newItem);
    }
});

HeaderItem header = new HeaderItem(headerTitle);
Row row = new ListRow(header, adapter);

ไลบรารีแท็บ Leanback

เทมเพลตชุดเครื่องมือ UI ของ Leanback มีการนำทางด้านข้างในหน้าจอเรียกดู หากต้องการเพิ่มแถวของแท็บในแนวนอนที่ด้านบนของแอป คุณสามารถใช้แท็บ Leanback แทนได้

เพิ่มทรัพยากร Dependency ของไลบรารีลงในโปรเจ็กต์

implementation "androidx.leanback:leanback-tab:$version"

จากนั้นใช้แท็บโดยใช้ LeanbackTabLayout และ LeanbackViewPager โดย ทำตามคู่มือ ViewPager ที่มีอยู่ โปรดทราบว่า LeanbackViewPager อิงตาม ViewPager ไม่ใช่ ViewPager2

ตัวอย่างมีดังนี้

Kotlin

val leanbackTabLayout = findViewById<LeanbackTabLayout>(R.id.tab_layout)
val leanbackViewPager = findViewById<LeanbackViewPager>(R.id.view_pager)

leanbackViewPager.setAdapter(adapter)
leanbackTabLayout.setupWithViewPager(leanbackViewPager)

Java

LeanbackTabLayout leanbackTabLayout = findViewById(R.id.tab_layout);
LeanbackViewPager leanbackViewPager = findViewById(R.id.view_pager);

leanbackViewPager.setAdapter(adapter);
leanbackTabLayout.setupWithViewPager(leanbackViewPager);

ข้อจำกัด

ไลบรารีแท็บ Leanback มีข้อจำกัดในธีมที่รองรับและวิธีจัดการการเคลื่อนไหวของโฟกัส

ธีมที่รองรับ

รองรับเฉพาะธีมที่ได้มาจาก Theme.AppCompat TabLayout มีข้อจำกัดในการบังคับใช้ธีม ซึ่งจะป้องกันไม่ให้ใช้ธีมที่ไม่ใช่ธีมย่อยของ Theme.AppCompat นอกจากนี้ คุณยังใช้ธีมบริดจ์สำหรับชุดเครื่องมือ UI ของ Leanback ได้ด้วย

การเคลื่อนไหวของโฟกัสจากแท็บไปด้านบน

เมื่อความสูงของเลย์เอาต์มากกว่าความสูงของหน้าจอและคุณกดปุ่ม D-pad ขึ้น การควบคุมจะย้ายกลับไปที่แท็บแทนที่จะอยู่ใน Fragment และไปยังรายการที่อยู่เหนือรายการนั้น (ดูรูปที่ 1) หากต้องการจัดการปัญหานี้ เนื้อหา ภายใน Fragment ต้องลบล้างการค้นหาโฟกัส เช่น ใช้ RowsSupportFragment BrowseSupportFragment ไม่สามารถใช้ภายในแท็บได้เนื่องจากมีเมธอดการค้นหาโฟกัสที่ลบล้างแล้วซึ่ง จะป้องกันไม่ให้โฟกัสย้ายกลับไปที่แท็บ

รูปที่ 1 ปุ่ม D-pad ขึ้นจะย้ายโฟกัสไปที่แท็บแทนที่จะเป็นรายการก่อนหน้า