대부분의 AndroidX 라이브러리는 Android TV와 함께 사용할 수 있습니다. ViewModel
와 같은 아키텍처 구성요소를 사용하여 수명 주기 인식 UI 데이터를 관리하고 Room
를 사용하여 모바일에서와 마찬가지로 로컬 SQLite 데이터베이스를 쉽게 사용할 수 있습니다. 그러나 Android TV 전용 기능을 지원하는 TV 전용 라이브러리도 몇 가지 있습니다. 이러한 라이브러리에는 다음이 포함됩니다.
- Leanback 라이브러리는 Android TV 앱 만들기를 단순화하는 UI 템플릿을 제공합니다.
- Leanback Preferences 라이브러리는 플랫폼과 일치하지만 앱에 맞게 테마를 지정할 수 있는 환경설정 및 설정 화면을 제공합니다.
- Leanback Paging 라이브러리는 Leanback 템플릿에서 흔히 사용되는
ObjectAdapters
용 AndroidX 페이징 모델을 지원합니다. - Leanback Tabs 라이브러리는 Android TV에서 탭 탐색을 지원합니다.
Leanback Paging 라이브러리
Leanback용 페이징은 RecyclerView.Adapter
에 페이징을 추가하는 작업을 간소화하는 AndroidX Paging 3 라이브러리와 동일하게 작동합니다.
Leanback을 사용하면 노출되는 어댑터가 일반적으로 ObjectAdapter
입니다. 따라서 Leanback Paging 라이브러리는 ObjectAdapter
에 페이징 지원을 추가합니다.
먼저 프로젝트에 라이브러리를 추가합니다.
implementation "androidx.leanback:leanback-paging:$version"
그런 다음 androidx.paging.PagingDataAdapter
대신 androidx.leanback.paging.PagingDataAdapter
를 사용하여 Paging 3 문서를 따르세요. 유일한 차이점은 이제 Presenter
또는 PresenterSelector
을 전달할 수 있다는 것입니다.
ListRow
와 같이 일반적으로 ObjectAdapter
를 사용하는 모든 위치에서 작동합니다.
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 Tabs 라이브러리
Leanback 템플릿은 많은 앱에서 잘 작동하는 탐색 환경에서 측면 탐색을 제공합니다. 탭 탐색 (일반적으로 앱 상단에 가로로 표시됨)이 필요한 경우 Leanback 탭을 사용하면 됩니다.
프로젝트에 라이브러리를 추가합니다.
implementation "androidx.leanback:leanback-tab:$version"
그런 다음 기존 ViewPager 가이드에 따라 LeanbackTabLayout
및 LeanbackViewPager
를 사용하여 탭을 구현합니다. LeanbackViewPager
는 ViewPager2
가 아닌 ViewPager
를 기반으로 합니다.
간단한 예시는 다음과 같습니다.
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 Tabs 라이브러리에는 다음과 같은 제한 사항이 있습니다.
지원되는 테마
Theme.AppCompat
에서 파생된 테마만 지원됩니다. TabLayout
에는 Theme.AppCompat
의 하위 테마가 아닌 테마가 사용되지 않도록 방지하는 테마 적용 제약 조건이 포함되어 있습니다. Leanback에 브리지 테마를 사용할 수도 있습니다.
탭에서 상단으로 이동 포커스
레이아웃 높이가 화면 높이보다 크고 D패드 위쪽 버튼을 누르면 컨트롤이 프래그먼트 내부에 머무르며 그 위의 항목으로 이동하는 대신 탭으로 다시 이동합니다 (동영상 참고). 이 문제를 처리하려면 프래그먼트 내의 콘텐츠가 포커스 검색을 재정의해야 합니다. 예를 들어 이 문제를 처리하려면 RowsSupportFragment
를 사용하세요. BrowseSupportFragment
에는 포커스가 탭으로 다시 이동하지 못하게 하는 재정의된 포커스 검색 메서드가 있으므로 탭 내에서 사용할 수 없습니다.