字体 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 布局加载到 RelativeLayout
或 LinearLayout 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 文本样式的新字体。
我希望这对以后遇到同样问题的任何人都有意义。
android.support.v7 上的 AppCompat 小部件似乎有问题。基本上,我使用 getLayoutInflator().inflate()
将 XML 布局加载到 RelativeLayout
或 LinearLayout 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 文本样式的新字体。
我希望这对以后遇到同样问题的任何人都有意义。