如果我从代码创建 TextView(在特定设备上),为什么字体不适用

Val*_*aal 5 xml android textview

我将项目中的字体更改为自定义字体。它在模拟器和许多设备上工作正常,但在某些设备上它在某些情况下不起作用,例如,当我从代码创建 TextView 时。

我有一个示例项目来演示这个问题。

这是我的样式文件

<resources>
    <style name="TextStyle.Caption" parent="TextAppearance.AppCompat.Caption">
        <item name="android:textSize">12sp</item>
        <item name="android:fontFamily">@font/eesti_pro_display_bold</item>
        <item name="android:letterSpacing">0.03</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

这是我的 xml。这里我有 TextView 和 textAppearance

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:textAppearance="@style/TextStyle.Caption"/>

</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

我创建另一个 TextView 的 Activity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val layout: ConstraintLayout = findViewById(R.id.container)
        createItemTitleTextView(this.baseContext).apply {
            layout.addView(this)
            text = "Hello World from code!"
        }
    }
}

private fun createItemTitleTextView(context: Context) = TextView(context).apply {
    TextViewCompat.setTextAppearance(this, R.style.TextStyle_Caption)
}
Run Code Online (Sandbox Code Playgroud)

模拟器上的结果(预期结果):

模拟器结果

三星 Galaxy J5 的结果。斜体字体是Galaxy系统字体。请注意,我的字体是从 xml 运行的,但不是从代码运行的

在此输入图像描述

编辑

我知道我可以使用 setTypeface 并且一切都按预期工作,但我想知道为什么 setTextAppearance 不起作用。因为我只想更改样式文件,而不是整个项目,并从代码中将 setTypeface 添加到每个 TextView

Val*_*aal 3

TextViewCompat.setTextAppearance(tv, R.style.TextStyle_Caption)不起作用,因为我创建了 TextView。但是,我需要创建AppCompatTextView并且一切都按预期工作