You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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指定字体:

  1. 在android/app/src/main/res/下创建font目录,放入字体文件并命名为小写(如fredokaone_regular.ttf)
  2. 修改布局文件:
<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:38:12