Android应用Toast无法正确获取本地化资源问题咨询
问题:Toast提示无法随应用语言切换更新
我开发了一款可添加、保存并展示Activity对象的应用,操作完成时会显示Toast提示。应用支持两种语言,且已配置对应资源文件。所有UI元素的本地化均正常,但成功操作时显示的Toast提示无法正确切换语言。我使用了应用上下文,但切换语言后,Toast仍显示旧语言内容,而其他UI已使用新语言。两种语言的资源字符串不重复,请问问题出在哪里?
相关代码片段
private void uploadActivities(FirebaseFirestore db, ArrayList<ActivityModel> activities) { for (int i = 0; i < allRecurringActivities.size(); i++) { db.collection("Project").document(Prefs.getString("iD", GlobalObject.FIRESTORE_ID)) .collection("activities") .document(activities.get(i).getId()) .set(activities.get(i)) .addOnSuccessListener(unused -> { Toast.makeText(context, "" + context.getApplicationContext().getResources().getString(R.string.success) + "!", Toast.LENGTH_SHORT).show(); for (ActivityModel allRecurringActivity : allRecurringActivities) { AlarmUtils.setAlarm(context, allRecurringActivity); } } ) .addOnFailureListener(e -> Log.d("uploadActivities", "FAILED")); } }
问题原因与修复方案
核心问题
你误用了**应用上下文(Application Context)**的资源。应用上下文的Locale是在应用启动时初始化的全局配置,手动切换语言后,通常只会更新当前Activity(及后续启动的组件)的Locale,不会修改应用上下文的Locale,导致从应用上下文获取的字符串始终是旧语言版本。
修复代码
直接使用传入的context(即Activity上下文)获取字符串资源,移除getApplicationContext()调用:
Toast.makeText(context, context.getString(R.string.success) + "!", Toast.LENGTH_SHORT).show();
Activity上下文会跟随你设置的当前Locale实时更新,能正确读取对应语言的资源字符串。
额外注意事项
- 确保你的语言切换逻辑是通过修改
Configuration的Locale后重启Activity,这样Activity重启后新Locale会生效,上下文资源也会同步更新。 - 不要在异步回调中提前缓存资源字符串,每次需要显示时都实时从上下文获取,避免因Locale切换导致缓存内容失效。
内容的提问来源于stack exchange,提问作者Alula48
相关产品推荐
相关产品推荐

