Leanback UI 툴킷 라이브러리

Compose를 사용한 효과적인 개발
Android TV OS용 Jetpack Compose를 사용하여 최소한의 코드로 멋진 UI를 만드세요.

지원 중단된 Leanback UI 툴킷은 Android TV OS용으로 개발된 앱 전용의 TV 관련 라이브러리를 제공합니다. 이러한 라이브러리에는 다음이 포함됩니다.

  • Leanback 라이브러리: Android TV 앱 생성을 간소화하는 UI 템플릿을 제공합니다.
  • Leanback 환경설정 라이브러리: 플랫폼과 일관되지만 앱에 맞게 테마를 지정할 수 있는 환경설정 및 설정 화면을 제공합니다.
  • Leanback 페이징 라이브러리: Leanback 템플릿과 함께 일반적으로 사용되는 ObjectAdapters의 AndroidX 페이징 모델을 지원합니다.
  • Leanback Tabs 라이브러리: Android TV에서 탭 탐색을 지원합니다.

Leanback 페이징 라이브러리

Leanback UI 툴킷 내부의 페이징은 AndroidX Paging 3 라이브러리와 동일하게 작동하므로 RecyclerView.Adapter에 페이징을 쉽게 추가할 수 있습니다. Leanback Paging 라이브러리를 사용하면 노출되는 어댑터는 일반적으로 ObjectAdapter이므로 라이브러리는 ObjectAdapter에 페이징 지원을 추가합니다.

앱에 페이징 어댑터를 추가하려면 먼저 프로젝트에 라이브러리 종속 항목을 추가하세요.

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

그런 다음 androidx.paging.PagingDataAdapter 대신 androidx.leanback.paging.PagingDataAdapter를 사용하여 페이징 3 문서를 따릅니다. 유일한 차이점은 이제 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)

자바

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 탭 라이브러리

Leanback UI 툴킷 템플릿은 탐색 화면에 측면 탐색을 제공합니다. 앱 상단에 탭 행을 가로로 추가하려면 대신 Leanback 탭을 사용하세요.

프로젝트에 라이브러리 종속 항목을 추가합니다.

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

그런 다음 기존 ViewPager 가이드에 따라 LeanbackTabLayoutLeanbackViewPager를 사용하여 탭을 구현합니다. LeanbackViewPagerViewPager2이 아닌 ViewPager을 기반으로 합니다.

다음은 그 예시입니다.

Kotlin

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

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

자바

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의 비하위 테마가 사용되지 않도록 하는 테마 시행 제약 조건이 포함되어 있습니다. Leanback UI 툴킷에 브리지 테마를 사용할 수도 있습니다.

탭에서 상단으로 포커스 이동

레이아웃 높이가 화면 높이보다 큰 경우 D패드 위쪽 버튼을 누르면 컨트롤이 프래그먼트 내에 유지되지 않고 탭으로 다시 이동하여 위에 있는 항목으로 이동합니다 (그림 1 참고). 이 문제를 처리하려면 프래그먼트 내부의 콘텐츠가 포커스 검색을 재정의해야 합니다. 예를 들어 RowsSupportFragment를 사용합니다. BrowseSupportFragment은 탭 내부에서 사용할 수 없습니다. 포커스가 탭으로 다시 이동하는 것을 방지하는 재정의된 포커스 검색 메서드가 있기 때문입니다.

그림 1. D패드 위 버튼을 누르면 이전 항목 대신 탭으로 포커스가 이동합니다.