Android TV:更改浏览片段行标题的文本颜色和字体

13

如何更改浏览片段中行标题的文本颜色和字体? 不是菜单中的文本,而是出现在行上方的文本。

3个回答

19

我假定您正在使用提供的android.support.v17.leanback.widget.RowHeaderPresenter作为BrowseFragmentHeaderFragment的呈现器。

RowHeaderPresenterR.layout.lb_row_header中填充布局,该布局如下所示:

<android.support.v17.leanback.widget.RowHeaderView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row_header"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="?rowHeaderStyle" />

如您所见,这里使用了名为 rowHeaderStyle 的样式属性,通常指向 @style/Widget.Leanback.Row.Header。您可以通过在 styles.xml 中添加以下内容来覆盖它:

<style name="MyCustomRowHeaderStyle" parent="Widget.Leanback.Row.Header">
    <item name="android:textColor">@color/red</item>
</style>

<style name="MyCustomBrowseStyle" parent="Theme.Leanback.Browse">
    <item name="rowHeaderStyle">@style/MyCustomRowHeaderStyle</item>
</style>

然后在AndroidManifest.xml中声明,在包含BrowseFragmentActivity中使用MyCustomBrowseStyle


6
除了David的回答外,rowHeaderStyle应用于HeaderFragment中的菜单项和RowFragment中的行标题(这两个片段组成您的BrowseFragment)。如果您希望它们的样式(尤其是字体颜色)不同,可以覆盖BrowseFragment::onCreateHeadersFragment()并在那一点上应用特定的主题。 1)将这些样式添加到styles.xml
<style name="AppTheme.Leanback.Browse.Row" parent="@style/Theme.Leanback.Browse">
    <item name="rowHeaderStyle">@style/AppTheme.Leanback.Row</item>
</style>

<style name="AppTheme.Leanback.Browse.Header" parent="@style/AppTheme.Leanback.Browse.Row">
    <item name="rowHeaderStyle">@style/AppTheme.Leanback.Header</item>
</style>

<style name="AppTheme.Leanback.Row" parent="Widget.Leanback.Row.Header">
    <item name="android:textColor">@color/font_row</item>
</style>

<style name="AppTheme.Leanback.Header" parent="Widget.Leanback.Row.Header">
    <item name="android:textColor">@color/font_header</item>
</style>

2) 在清单文件中将 AppTheme.Leanback.Browse.Row 主题应用于您的活动。

3) 在您的 BrowseFragment 中将 AppTheme.Leanback.Browse.Header 主题应用于标题:

// Kotlin snippet
override fun onCreateHeadersFragment() : HeadersFragment {
    class CustomHeadersFragment : HeadersFragment() {
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
            return super.onCreateView(
                    inflater.cloneInContext(ContextThemeWrapper(inflater.context, R.style.AppTheme_Leanback_Browse_Header)),
                    container,
                    savedInstanceState
            )
        }
    }

    return CustomHeadersFragment()
}

1
我找不到onCreateHeadersFragment的覆盖位置。显然,我正在运行较旧版本的leanback,该方法最近已添加到25.3.0中。https://developer.android.com/reference/android/support/v17/leanback/app/BrowseFragment.html#onCreateHeadersFragment() - Hless

4
david.mihola提供的答案解决了颜色问题,但我仍然在全局设置自定义字体方面遇到了问题。为了帮助所有遇到同样疑惑的人,这是我的解决方案:
感谢chrisjenx (Calligraphy)所做的出色工作,您可以轻松地设置全局(自定义)字体。
只需将Calligraphy添加到gradle.build中,并将以下代码片段添加到Application.onCreate()中即可:
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath("fonts/MyCustomFont.ttf")
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );

在每个Activity中添加以下内容:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

这对每个TextView都做了字体的处理,而不需要修改布局。Calligraphy文档还提供了更多可能性。请查看它。

我希望这能帮助其他人找到这个问题并尝试全局设置(自定义)字体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接