【问题标题】:Theme.MaterialComponents does not change font of dialog titleTheme.MaterialComponents 不会改变对话框标题的字体
【发布时间】:2019-03-12 09:18:36
【问题描述】:

我正在为我们的应用程序使用材料组件主题。现在我们想要一个自定义字体,我设法通过以下主题将其应用到几乎所有地方,它使用材质组件定义的各种textAppearance... 属性。

这很好用,主题也适用于几乎所有地方的 AlertDialogs - 消息文本和按钮具有自定义字体,按钮具有正确的强调色等。

无论如何,只有对话框标题保留 Roboto 字体。

<!-- externalized font name for easier change -->
<string name="font_regular" translatable="false" tools:ignore="ReferenceType">@font/atma_regular</string>

<style name="Theme.App" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textColorPrimary">@color/textColorPrimary</item>
    <item name="android:textColorSecondary">@color/textColorSecondary</item>

    <item name="textAppearanceHeadline1">@style/TextAppearance.App.Button</item>
    <item name="textAppearanceHeadline2">@style/TextAppearance.App.Button</item>
    <item name="textAppearanceHeadline3">@style/TextAppearance.App.Button</item>
    <item name="textAppearanceHeadline4">@style/TextAppearance.App.Button</item>
    <item name="textAppearanceHeadline5">@style/TextAppearance.App.Button</item>
    <item name="textAppearanceHeadline6">@style/TextAppearance.App.Button</item>
    <item name="textAppearanceSubtitle1">@style/TextAppearance.App.Subtitle1</item>
    <item name="textAppearanceSubtitle2">@style/TextAppearance.App.Subtitle2</item>
    <item name="textAppearanceBody1">@style/TextAppearance.App.Body1</item>
    <item name="textAppearanceBody2">@style/TextAppearance.App.Body2</item>
    <item name="textAppearanceButton">@style/TextAppearance.App.Button</item>
    <item name="android:textAppearanceLarge">@style/TextAppearance.App.Large</item>
    <item name="android:textAppearanceMedium">@style/TextAppearance.App.Medium</item>
    <item name="android:textAppearanceSmall">@style/TextAppearance.App.Small</item>
</style>

<style name="TextAppearance.App.Subtitle1" parent="TextAppearance.MaterialComponents.Subtitle1">
    <item name="fontFamily">@string/font_regular</item>
    <item name="android:fontFamily">@string/font_regular</item>
</style>
...

我尝试为警报对话框定义一个额外的主题,如下所示:

<style name="Theme.App" parent="Theme.MaterialComponents.Light.NoActionBar">
    ...
    <item name="alertDialogTheme">@style/Theme.App.AlertDialog</item>
    ...
</style>

<style name="Theme.App.AlertDialog" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="android:windowTitleStyle">@style/TextAppearance.App.DialogWindowTitle</item>
</style>

<style name="TextAppearance.App.DialogWindowTitle" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
    <item name="fontFamily">@string/font_regular</item>
    <item name="android:fontFamily">@string/font_regular</item>
    <item name="android:textSize">30sp</item>
</style>

但这会重置所有地方的颜色和字体。唯一应用的是 textSize。

实现这一点确实不应该那么难,但我现在没有想法。我可以以编程方式应用字体,但这会很丑。

【问题讨论】:

  • 你说的是自定义字体。 @string/font_regular 里面是什么?只是像sans-serif 这样的字符串?你没试过直接设置吗? &lt;item name="android:fontFamily"&gt;sans-serif&lt;/item&gt;
  • @Mohsen 我在我的问题中添加了@string/font_regular(在顶部)。值也可以是 sans-serif 等。正如您在屏幕截图中看到的,它在除标题之外的任何地方都有效。我尝试了您的建议,但不幸的是它不起作用。
  • @Ridcully 你最后是怎么改变标题字体的?正在为同样的问题而苦苦挣扎。

标签: android material-design android-alertdialog material-components-android material-components


【解决方案1】:

正如您提到的,MaterialAlertDialogBuilder 创建的AlertDialog 使用您的应用主题中的 textAppearanceSubtitle1 属性定义的样式。

否则,您可以使用以下方式更改 AlertDialog 使用的样式:

new MaterialAlertDialogBuilder(MainActivity.this,
    R.style.MyTitle_ThemeOverlay_MaterialComponents_MaterialAlertDialog)
    .setTitle("Title")
    .setMessage("Message......")
    .setPositiveButton("ok", null)
    .setNegativeButton("Cancel", null)
    .show();

在您的风格中,您必须自定义 materialAlertDialogTitleTextStyle 属性:

  <style name="MyTitle_ThemeOverlay.MaterialComponents.MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="materialAlertDialogTitleTextStyle">@style/MyTitle_MaterialAlertDialog.MaterialComponents.Title.Text</item>
  </style>
  <style name="MyTitle_MaterialAlertDialog.MaterialComponents.Title.Text" parent="@style/MaterialAlertDialog.MaterialComponents.Title.Text">
    <item name="android:textAppearance">@style/MyTitle_TextAppearance.MaterialComponents.Subtitle1</item>
  </style>
  <style name="MyTitle_TextAppearance.MaterialComponents.Subtitle1" parent="TextAppearance.MaterialComponents.Subtitle1">
    <item name="fontFamily">....</item>
    <item name="android:fontFamily">....</item>
    <item name="android:textStyle">.....</item>
  </style>

【讨论】:

    【解决方案2】:

    感谢您的提问,我意识到我使用了不正确的属性来分配标题样式(android:titleTextAppearance 而不是 android:windowTitleStyle)。

    您的问题似乎已在此期间得到解决,因为您的确切代码截至今天似乎对我有效。

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      相关资源
      最近更新 更多