TextAppearance 覆盖样式的 fontFamily

TextAppearance override style's fontFamily

我有一个带有自定义 fontFamily 的 TextView 样式。另外,我的 textAppearance 有一个单独的样式。

当我将我的 TextView 样式和 textAppearance 样式设置为单个 TextView 时,fontFamily 被忽略了。但是当样式设置没有 textAppearace 时一切正常。

使用爱彼迎的 Paris 库设置样式。

TextView 样式:

<style name="TextViewBold" parent="Widget.MaterialComponents.TextView">
    <item name="fontFamily">@font/roboto_bold</item>
    <item name="android:fontFamily">@font/roboto_bold</item>
    <item name="android:textColor">@color/black</item>
</style>

文本外观样式:

<style name="TextAppearanceAllCaps">
    <item name="textAllCaps">true</item>
    <item name="android:textAllCaps">true</item>
    <item name="android:textColor">@color/anotherColor</item>
</style>

以编程方式设置的样式:

MaterialTextView(context!!).apply {
        style(R.style.TextViewBold) //Paris used here
        updateTextAppearance(R.style.TextAppearanceAllCaps) //custom extension
        setText(R.string.some_text)
}

分机号:[=​​15=]

fun TextView.updateTextAppearance(@StyleRes resId: Int) {
    TextViewCompat.setTextAppearance(this, resId)
}

我该如何解决这个问题?

你可以这样做:

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textAllCaps="true"
    android:textColor="@color/white"
    android:theme="your theme"
    />

我建议使用此工作流程来设置文本样式:

  1. 在主题中的 textViewStyle 默认样式中设置任何应用范围的样式。

  2. 设置一个(小)选择您的应用程序将使用的 TextAppearances(或 use/extend 来自 MaterialComponent 的 styles)并直接从您的视图中引用这些

  3. 创建样式设置 TextAppearance(它们本身指定您的 TextAppearances 之一)不支持的任何属性。

  4. 直接在您的布局中执行任何独特的样式设置。

感谢所有愿意提供帮助的人!

我发现了一个问题和一个解决方案(针对我的具体情况)。在大多数情况下,您可以查看已接受的答案。

问题:

textAppearance 以编程方式设置时,样式 fontFamily 属性会被擦除。我什至尝试延迟设置我的文本外观,以检查 UI 线程是否未超载,但没有帮助。 另外,我尝试在没有 Paris 的情况下设置样式,它也没有帮助。

顺便说一句,我没有找到原因:(

解决方案:

我只用 TextView 元素创建了 XML 文件(感谢 @D_K 的提示)。然后我在 XML 中设置样式和文本外观,并在我需要的地方膨胀它。 只有使用这种方法,我才实现了我想要的。

P.S。如果您对文本颜色有疑问,只需在文本视图样式中将其设置为 @null,然后将使用 textAppearance 中的 textColor

只需从定义了 fontFamily 的父级继承 TextAppearance 或将其添加到您的自定义 TextAppearance.

例如:

<style name="TextViewBold" parent="Widget.MaterialComponents.TextView">
   <item name="android:textAppearance">TextAppearance.App</item>
</style>


<style name="TextAppearance.App" parent="TextAppearance.MaterialComponents.Body1">
   <item name="fontFamily">@font/roboto_bold</item>
   <!-- .... -->
</style>

<!-- Inherit from TextAppearance.App -->
<style name="TextAppearance.App.AllCaps"> 
   <item name="textAllCaps">true</item>
</style>

然后将样式 @style/TextViewBold 应用于 TextView 并使用 style/TextAppearance.App.AllCaps

更新 textAppearance