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使用:
- 先创建自定义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; } }
- 在
AndroidManifest.xml里注册这个Application:
<application android:name=".MyApp" <!-- 替换成你的自定义Application类路径 --> android:icon="@mipmap/ic_launcher" android:label="@string/app_name"> <!-- 其他Activity等配置 --> </application>
- 之后在
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
相关产品推荐
相关产品推荐

