android-tv изменение цвета текста и шрифта заголовка строк фрагмента обзора

Как изменить цвет текста и шрифт заголовка строк в фрагменте обзора?. Текст не в меню, а текст, который появляется над строками.

3 ответов


я предполагаю, что вы используете, предусмотренного android.support.v17.leanback.widget.RowHeaderPresenter в качестве представителя HeaderFragment в своем BrowseFragment.

на RowHeaderPresenter надувает макет от R.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>

и затем использовать MyCustomBrowseStyle на Activity содержащий BrowseFragment by объявление его в вашем AndroidManifest.xml.


ответ Дэвид.михола помогает с цветом, однако у меня все еще были проблемы с настройкой пользовательского шрифта по всему миру. Для всех, кто натыкается на этот вопрос и озадачен этим, вот мое решение:

благодаря удивительной работе chrisjenx (каллиграфия), вы можете легко установить глобальный (пользовательский) шрифт.

просто добавьте каллиграфию к вашему gradle.создайте и добавьте следующий фрагмент Application.onCreate():

CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath("fonts/MyCustomFont.ttf")
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );

и в каждом действии добавьте следующее:

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

Это сделало шрифт-трюк для меня на каждом TextView, без изменения макетов. Документация каллиграфии также предлагает некоторые дополнительные возможности. Проверить его.

Я надеюсь, что это поможет другим людям, которые находят этот вопрос и пытаются установить (пользовательские) шрифты по всему миру.


В дополнение к ответу Давида.

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) применить AppTheme.Leanback.Browse.Header тема для заголовков в вашем BrowseFragment:

// 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()
}