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 объявив это в вашем AndroidManifest.xml,

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

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

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

Благодаря потрясающей работе https://github.com/chrisjenx/Calligraphy вы можете легко установить глобальный (пользовательский) шрифт.

Просто добавьте Каллиграфию в свой gradle.build и добавьте следующий фрагмент в свой 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 без изменения макетов. Документация Каллиграфии также предлагает еще несколько возможностей. Проверьте это.

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

Другие вопросы по тегам