在我的活动中,我有一个自定义工具栏。我试图更改其标题字体。
以前,我可以通过将字体放在资产文件夹中来实现。 使用Android Studio 3,我们现在可以使用fontFamily和FontsContract。 我通过以下代码尝试了这种方法:
mToolbar.setTitleTextAppearance(context,R.style.AppTheme_ActionBarText);
和风格
<style name="AppTheme.ActionBarText" parent="@android:style/Widget.ActionBar.TabText">
<item name="fontFamily">@font/ultra</item>
</style>
当我运行应用程序时,几秒钟后(下载自定义字体所需的时间),应用程序崩溃并显示以下日志:
java.lang.NullPointerException:尝试从字段&#39; int中读取 android.support.v4.provider.FontsContractCompat $ TypefaceResult.mResult&#39; 在null对象引用上 在android.support.v4.provider.FontsContractCompat $ 2.onReply(FontsContractCompat.java:277) 在android.support.v4.provider.FontsContractCompat $ 2.onReply(FontsContractCompat.java:274) 在android.support.v4.provider.FontsContractCompat $ 3.onReply(FontsContractCompat.java:312) 在android.support.v4.provider.FontsContractCompat $ 3.onReply(FontsContractCompat.java:300) 在android.support.v4.provider.SelfDestructiveThread $ 2 $ 1.run(SelfDestructiveThread.java:149) 在android.os.Handler.handleCallback(Handler.java:739) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:158) 在android.app.ActivityThread.main(ActivityThread.java:7225) at java.lang.reflect.Method.invoke(Native Method) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
这是一个错误还是有正确的方法通过xml加载字体? 我知道另一种方法是以编程方式加载字体并使用监听器在文本上设置字体。
**编辑:在第二次运行应用程序时,没有发生崩溃(因为已经下载了字体)。出于测试目的,我在每次崩溃后都要更改字体以进行调试......
答案 0 :(得分:5)
当用户尝试使用可下载字体启动应用时,如果设备上没有互联网并且之前未下载此字体,则会出现问题。然后应用程序将启动,但崩溃只会在~5-10 sech之后发生。我想当http超时发生时。
所以我没有解决方案,因此使用xml-fonts代替可下载字体,请参阅https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html
仅供参考:将所有可下载字体加载到您设备上的/data/data/com.google.android.gms/files/fonts文件夹中,如果您有root设备,那么很容易删除并重现此问题一次
答案 1 :(得分:4)
编辑:从支持库版本27.1.0开始,问题已得到解决。
这似乎是一个支持库问题。谷歌开发人员已表示该修复程序应在版本27.0.2之后可用,该版本目前未发布。
答案 2 :(得分:1)
根据docs,您在使用支持库26时应使用app
命名空间:
通过支持库在XML布局中声明字体系列时,请使用app namespace。
所以在你的代码中:
<item name="app:fontFamily">@font/ultra</item>
答案 3 :(得分:0)
当您第一次运行应用程序而没有任何Internet连接时,可能会发生此问题。检查您的互联网连接,然后重试。