【问题标题】:android-tv Changing text color and font of browse fragment rows headerandroid-tv 更改浏览片段行标题的文本颜色和字体
【发布时间】:2016-02-19 20:09:33
【问题描述】:

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

【问题讨论】:

    标签: android-tv leanback


    【解决方案1】:

    我假设您使用提供的 android.support.v17.leanback.widget.RowHeaderPresenter 作为 HeaderFragment 在您的 BrowseFragment 中的演示者。

    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>
    

    然后将MyCustomBrowseStyle 用于包含BrowseFragmentActivity,方法是在您的AndroidManifest.xml 中声明它。

    【讨论】:

      【解决方案2】:

      除了大卫的回答。

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

      【讨论】:

      【解决方案3】:

      david.mihola 的回答有助于颜色,但是我在全局设置自定义字体时仍然遇到问题。对于偶然发现这个问题并对此感到困惑的每个人,这是我的解决方案:

      感谢chrisjenx (Calligraphy) 所做的出色工作,您可以轻松设置全局(自定义)字体。

      只需将 Calligraphy 添加到您的 gradle.build 并将以下 sn-p 添加到您的 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 上完成了字体技巧,而无需修改布局。书法的文献也提供了更多的可能性。看看吧。

      我希望这对发现此问题并尝试在全球范围内设置(自定义)字体的其他人有所帮助。

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2014-07-03
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 2014-02-17
        • 1970-01-01
        相关资源
        最近更新 更多