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"
/>
我建议使用此工作流程来设置文本样式:
在主题中的 textViewStyle 默认样式中设置任何应用范围的样式。
设置一个(小)选择您的应用程序将使用的 TextAppearances(或 use/extend 来自 MaterialComponent 的 styles)并直接从您的视图中引用这些
创建样式设置 TextAppearance(它们本身指定您的 TextAppearances 之一)不支持的任何属性。
直接在您的布局中执行任何独特的样式设置。
感谢所有愿意提供帮助的人!
我发现了一个问题和一个解决方案(针对我的具体情况)。在大多数情况下,您可以查看已接受的答案。
问题:
当 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
我有一个带有自定义 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"
/>
我建议使用此工作流程来设置文本样式:
在主题中的 textViewStyle 默认样式中设置任何应用范围的样式。
设置一个(小)选择您的应用程序将使用的 TextAppearances(或 use/extend 来自 MaterialComponent 的 styles)并直接从您的视图中引用这些
创建样式设置 TextAppearance(它们本身指定您的 TextAppearances 之一)不支持的任何属性。
直接在您的布局中执行任何独特的样式设置。
感谢所有愿意提供帮助的人!
我发现了一个问题和一个解决方案(针对我的具体情况)。在大多数情况下,您可以查看已接受的答案。
问题:
当 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