React Native中MainActivity.java获取上下文及自定义字体加载问题
React Native启动页自定义字体加载失败,getAssets()上下文问题排查与修复
问题背景
在React Native应用中使用rn-splashscreen库实现启动页,尝试为标题TextView添加自定义字体时,遇到调用异常(实际是上下文使用时机或资源路径问题),尝试getApplicationContext()也未解决。
核心问题分析
你的代码中this.getAssets()本身是合法的——MainActivity作为Activity子类,本身就是Context实例,直接调用getAssets()没问题。真正导致报错的原因大概率是:
- 控件获取时机不对:启动页布局还未加载完成就调用
findViewById,导致splashText为null,后续操作引发异常,看起来像是getAssets()的问题 - 字体文件路径错误:字体未放在正确的
assets目录下,或者文件名大小写不匹配
修复方案
方案1:调整控件获取时机,确保布局加载完成
修改onCreate方法,延迟获取启动页的TextView,避免空指针:
package com.hackerkid; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.widget.TextView; import android.graphics.Typeface; import com.facebook.react.ReactActivity; import org.devio.rn.splashscreen.SplashScreen; public class MainActivity extends ReactActivity { @Override protected String getMainComponentName() { return "hackerkid"; } @Override protected void onCreate(Bundle savedInstanceState) { SplashScreen.show(this); // 必须保持在super.onCreate之前 super.onCreate(savedInstanceState); // 延迟100ms获取控件,确保启动页布局已加载 new Handler(Looper.getMainLooper()).postDelayed(() -> { TextView splashText = findViewById(R.id.splashTitle); if (splashText != null) { try { // 直接用this.getAssets()即可,MainActivity本身就是Context Typeface face = Typeface.createFromAsset(getAssets(), "fonts/FredokaOne-Regular.ttf"); splashText.setTypeface(face); } catch (Exception e) { e.printStackTrace(); } } }, 100); } }
方案2:确认字体文件位置与命名
确保字体文件满足以下要求:
- 路径:
android/app/src/main/assets/fonts/FredokaOne-Regular.ttf(若assets或fonts目录不存在,手动创建) - 文件名完全匹配:Android对文件大小写敏感,确保和代码中的路径一致,不要出现拼写错误
方案3:直接在布局XML中设置字体(更简便)
跳过Java代码,直接在启动页布局文件(如launch_screen.xml)中给TextView指定字体:
- 在
android/app/src/main/res/下创建font目录,放入字体文件并命名为小写(如fredokaone_regular.ttf) - 修改布局文件:
<TextView android:id="@+id/splashTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="你的启动页标题" android:fontFamily="@font/fredokaone_regular" />
关键注意点
- 不要使用
getApplicationContext()访问assets,Activity上下文(this)是访问资源的最优选择 - 始终对
findViewById的结果做非空判断,避免空指针异常
内容的提问来源于stack exchange,提问作者Sai Darshan
相关产品推荐
相关产品推荐

