字体 returns null on Android 4.4 当目标 API 高于 21 时查看父视图内的小部件

Typeface returns null on Android 4.4 when looking at widgets inside a parent view when targeting API higher than 21

android.support.v7 上的 AppCompat 小部件似乎有问题。基本上,我使用 getLayoutInflator().inflate() 将 XML 布局加载到 RelativeLayoutLinearLayout viewgroup 中。然后,我将视图组传递给提取子视图的函数,并尝试查看子视图的字体(如果它是 TextView、Button 或 EditText)。这适用于 Android 5 及更高版本。但是,在 Android 设备 运行 4.4.4 或更低版本上,子视图的字体 return 为空。为什么小部件 return 为空?

如果我膨胀视图组,然后将其添加到父级 activity 并通过 id 找到小部件,那么我可以获得字体。

如果是 TextView、按钮或 EditText,我需要更改子视图的字体。下面的代码适用于 Android 设备 运行 5 及以上但不低于 Android 5.

public void checkView(View view) {

// custom_typeface is already defined elsewhere in the code.
// If I check any of the widgets below for their typeface getTypeface(),
// it returns null on Android devices running 4.4.4 and below.

if (view instanceof TextView) {
    TextView txt = (TextView) view;
    Typeface custom_typeface = createTypefaceBasedOnExistingStyle(txt.getTypeface);
    txt.setTypeface(custom_typeface);
}

if (view instanceof EditText) {
    EditText edt = (EditText) view;
    Typeface custom_typeface = createTypefaceBasedOnExistingStyle(txt.getTypeface);
    edt.setTypeface(custom_typeface);
}

if (view instanceof Button) {
    Button btn = (Button) view;
    Typeface custom_typeface = createTypefaceBasedOnExistingStyle(txt.getTypeface);
    btn.setTypeface(custom_typeface);
}
}

如果有人对此问题有任何意见或解决方案,我将不胜感激。提前谢谢你。

好的,我明白是怎么回事了。似乎当您膨胀 XML 布局并尝试获取没有在设备 XML 文件中定义的 textStyle 属性 的小部件的字体时 运行 Android OS 在 4.4.4 或更低版本中,字体尚未定义,因此它将 return 为空。

在 Android 设备 运行 5.0 及更高版本上,小部件 return 无论如何都是默认字体,因为 textStyle 默认为 Normal。

设备 运行 Android 4.4.4 及以下版本的解决方案是在 XML 文件中将要更改字体的小部件上的 textStyle 定义为 Normal。这样,当 XML 布局膨胀时,就会定义 textStyle 并为该小部件创建字体。

或者,在代码中,我们可以检查字体 return 是否为空,然后只创建一个具有 Normal 文本样式的新字体。

我希望这对以后遇到同样问题的任何人都有意义。