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 без изменения макетов. Документация Каллиграфии также предлагает еще несколько возможностей. Проверьте это.
Я надеюсь, что это поможет другим людям, которые находят этот вопрос и пытаются установить (пользовательские) шрифты во всем мире.