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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:05:27