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

Android字符串资源转换问题:getResources().getString无法生效

问题解决:非Context类中无法调用getResources()获取字符串资源

嘿,我一眼就发现你代码里的问题啦!你在FilmList这个普通工具类里直接调用getResources()肯定行不通——这个方法是**Context类(比如Activity、Application这类组件)的专属方法**,普通Java类没有关联Context实例的话,根本没法直接调用它,这就是你之前方案失效的原因。

解决方案1:给getFilms()方法传入Context参数

这是最直接的做法,把需要的Context从调用处传递进来:

public class FilmList {
    public static ArrayList<Film> getFilms(Context context){ // 新增Context参数
        ArrayList<Film> films=new ArrayList<>();
        Film film=null;
        
        film =new Film();
        // 通过传入的context调用getResources()
        film.setName(context.getResources().getString(R.string.name1));
        film.setImage(R.drawable.img1);
        film.setDescription(context.getResources().getString(R.string.desc1));
        films.add(film);
        
        film =new Film();
        film.setName(context.getResources().getString(R.string.name2));
        film.setImage(R.drawable.img2);
        film.setDescription(context.getResources().getString(R.string.desc2));
        films.add(film);
        
        return films;
    }
}

调用的时候,在Activity或者Fragment里传当前Context就行:

// 在Activity中调用
ArrayList<Film> films = FilmList.getFilms(this);
// 在Fragment中调用
ArrayList<Film> films = FilmList.getFilms(getContext());

解决方案2:使用全局Application Context(无需每次传参)

如果你不想每次调用都传Context,可以自定义一个Application类,保存全局Context供整个App使用:

  1. 先创建自定义Application类:
public class MyApp extends Application {
    private static Context appContext;

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化全局Context
        appContext = getApplicationContext();
    }

    // 提供静态方法获取全局Context
    public static Context getAppContext() {
        return appContext;
    }
}
  1. 在AndroidManifest.xml里注册这个Application:
<application
    android:name=".MyApp" <!-- 替换成你的自定义Application类路径 -->
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name">
    <!-- 其他Activity等配置 -->
</application>
  1. 之后在FilmList里就可以直接用全局Context获取资源了:
public class FilmList {
    public static ArrayList<Film> getFilms(){
        ArrayList<Film> films=new ArrayList<>();
        // 获取全局Context
        Context context = MyApp.getAppContext();
        
        Film film=null;
        film =new Film();
        film.setName(context.getResources().getString(R.string.name1));
        film.setImage(R.drawable.img1);
        film.setDescription(context.getResources().getString(R.string.desc1));
        films.add(film);
        
        film =new Film();
        film.setName(context.getResources().getString(R.string.name2));
        film.setImage(R.drawable.img2);
        film.setDescription(context.getResources().getString(R.string.desc2));
        films.add(film);
        
        return films;
    }
}

⚠️ 小提醒:使用全局Context要注意避免内存泄漏,不过这里只是用来获取资源,不会长期持有引用,所以没问题,但别在其他地方随便把全局Context绑定到生命周期短的对象上哦。

内容的提问来源于stack exchange,提问作者Aidai A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:00