尝试声明自定义字体时类型不匹配

Type mismatch when trying to declare custom typeface

在设置片段中使用自定义字体时,在这种情况下需要使用哪个上下文?我知道 this 需要更改,但我找不到任何相关教程。

Type mismatch. Required: Context. Found: SettingsFragment

class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        addPreferencesFromResource(R.xml.preferences)
    }

    private val mTypeface = ResourcesCompat.getFont(this, R.font.open_dyslexic_regular)
}

在 fragment 中你可以调用 getContext 或 getActivity 而不是在获取自定义字体时传递它。但是您的代码会崩溃,因为当未附加到主机上下文的片段为空时,请尝试更改

private val mTypeface : Typeface get() = ResourcesCompat.getFont(requireContext(), R.font.open_dyslexic_regular)

与活动不同,片段不是上下文的子class。您会看到许多 Android 教程,其中 this 作为 Context 参数传递给某个函数,这是因为它们是从 Activity 内部而不是从 Fragment 中调用该代码。

Fragments 有一个 context 属性 你可以使用,但它是 null 在 Fragment 附加到 Activity 之前(就像 class 被初始化)和分离之后。

您可以使用lazy 属性委托,这样在调用getFont函数时上下文不会为空。但是如果你这样做,不要从片段分离后调用的回调中访问 属性。

private val mTypeface by lazy { ResourcesCompat.getFont(requireContext(), R.font.open_dyslexic_regular) }