我有Android Tv应用程序的自定义设计,并非所有这些都与leanback库中的小部件相匹配。 如何使用设计支持库(例如TabLayout)? 它抱怨我需要使用AppCompat主题。 我知道谷歌不建议在电视上使用标签。
答案 0 :(得分:1)
要在Leanback应用中创建TabLayout
,您可以使用ContextThemeWrapper
(我已在Kotlin中写过此内容):
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
val c = ContextThemeWrapper(activity, R.style.Theme_AppCompat)
return LayoutInflater.from(c).inflate(R.layout.my_tablayout, container, false)
}
为了使DPAD正常工作,我将TabLayout
子类化为如下:
class FocusableTabLayout(context: Context, attributeSet: AttributeSet): TabLayout(context, attributeSet) {
override fun focusSearch(focused: View?, direction: Int): View? {
val view = super.focusSearch(focused, direction)
if (hasFocus() && view != null) {
if (direction == View.FOCUS_LEFT) {
if (selectedTabPosition > 0) {
getTabAt(selectedTabPosition - 1)?.select()
}
} else if (direction == View.FOCUS_RIGHT) {
if (selectedTabPosition < tabCount) {
getTabAt(selectedTabPosition + 1)?.select()
}
}
}
return view
}
override fun requestFocus(direction: Int, previouslyFocusedRect: Rect?): Boolean {
val tabStrip = getChildAt(0) as LinearLayout
tabStrip.getChildAt(selectedTabPosition).requestFocus()
return true
}
}
如果您打算将TabLayout
与ViewPager
一起使用,请使用此子类来阻止一页上的DPAD互动触发幻灯片:
class FocusableViewPager(context: Context, attributeSet: AttributeSet): ViewPager(context, attributeSet) {
override fun executeKeyEvent(event: KeyEvent): Boolean {
return false
}
}
答案 1 :(得分:0)
TabLayout Focus无法与D-PAD(电视应用程序)一起使用。 我已经使用了app:tabMode =“ scrollable”属性 我没有带20个标签项的viewpager。