更改语言而不重新启动活动
Posted
技术标签:
【中文标题】更改语言而不重新启动活动【英文标题】:Change language without restarting activity 【发布时间】:2018-04-12 15:13:44 【问题描述】:如果用户愿意,我有一种方法可以将我的应用程序从英语翻译成瑞典语,然后再翻译回来。但是,我真的不喜欢活动每次都重新启动的事实,因为这让我很难使用savedInstaceState
,并且因此我遇到了几次崩溃。
这是我改变语言的方法的外观:
public void setApplicationLanguage(String language)
myLocale = new Locale(language);
Resources res = activity.getResources();
DisplayMetrics display = res.getDisplayMetrics();
Configuration configuration = res.getConfiguration();
configuration.locale = myLocale;
res.updateConfiguration(configuration, display);
Intent refresh = new Intent(activity, StartupActivity.class);
activity.startActivity(refresh);
是否有可能在没有以下条件的情况下应用相同的功能:
Intent refresh = new Intent(activity, StartupActivity.class);
activity.startActivity(refresh);
?
【问题讨论】:
将该方法放入有效的 OnResume 方法中。 在片段 onResume 中还是在活动的 onResume 中?因为方法需要的是一个字符串@SAVVY。 您可以将字符串设为该类的全局字符串,以便获取或设置该字符串 你可以制作一个单音类并获取和设置数据并将方法放在onresume方法中 如果你喜欢这个解决方案,那就让我正式回答吧! 【参考方案1】:试试这个
我也遇到了这个问题。我使用了下面的代码,然后它在不刷新活动的情况下更改了语言public void setLocale(String lang)
myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
onConfigurationChanged(conf);
/*Intent refresh = new Intent(this, androidLocalize.class);
startActivity(refresh);*/
@Override
public void onConfigurationChanged(Configuration newConfig)
// refresh your views here
lblLang.setText(R.string.langselection);
super.onConfigurationChanged(newConfig);
// Checks the active language
if (newConfig.locale == Locale.ENGLISH)
Toast.makeText(this, "English", Toast.LENGTH_SHORT).show();
else if (newConfig.locale == Locale.FRENCH)
Toast.makeText(this, "French", Toast.LENGTH_SHORT).show();
在Manifest中声明
android:configChanges="locale"
【讨论】:
当您说“刷新您的视图”时,我不知道该怎么做,因为我有一个完整的片段,其中包含 4 个字符串资源,可以从英语翻译成瑞典语,反之亦然。那么我应该在 //refresh your views here 中做什么 - 当我在问题中展示的方法对我有用时? 如何在// refresh your views here
代码块@VishalYadav 中为 ViewPager 设置标题
在<activity...
在你的活动标签中使用这个android:configChanges="locale"
【参考方案2】:
可以替换代码:
Intent refresh = new Intent(activity, StartupActivity.class);
activity.startActivity(refresh);
使用 Activity 类中的方法:
recreate();
我希望您的最低 SDK 版本能够支持,因为它是在 SDK 11 中引入的。您的活动将被重新创建为一个新实例记住!一切都会重新开始。根据我的经验,与创建新的Intent
相比,它的速度更快。但是如果你想传递一些数据,使用Intent
的方法比那更好!您可以向Intent
添加额外内容。
【讨论】:
您没有收到问题吗,有人问过在不重新启动活动的情况下更改语言。在您可以添加额外信息之后尝试回答所询问的内容。@Xenolion 这太老了,你投了反对票。好的,那么几乎不可能在不重新启动活动的情况下更改语言,否则实现将字符串值更改为不同语言@MaulikDodia 的另一个字符串的逻辑。那么你有答案吗?回答吧! 我也遇到了同样的问题。我担心的是,尽管您已经理解了这个问题,但您的答案却完全相反,而没有提及您在上面的评论中提到的内容,例如Okay then it is hardly possible to change the language without restarting the activity
。如果您已将此行放在答案中,那么只有您的答案看起来像 您没有确切的解决方案,但有替代解决方案。@Xenolion
我回答这个问题已经好几个月了,你有没有在用户的问题中看到这一行??是否有可能在没有以下情况下应用相同的功能:这就是我的答案所依据的!那么到时候我该怎么办呢?评论然后走? @MaulikDodia 至少问过的人觉得它很有用并投了赞成票。
当你回答时没关系。您必须回答所询问的内容。如果您没有确切的答案,您必须说明您为什么要提供 ALTERNATIVE 解决方案。有大量可用的解决方案不适合在 SO 上提出的问题。这会导致时间浪费和误导。 @Xenolion【参考方案3】:
创建一个单例类:
public class Singleton
private static Singleton mInstance = null;
private int repeat = 0;
public int getRepeat()
return repeat;
public void setRepeat(int repeat)
this.repeat = repeat;
现在你有了一个可以设置和获取数据的方法,所以创建一个方法并将它放在onResume()
方法下,调用你的方法,你可以像这样获取和设置数据:
Singleton.getInstance().setRepeat(1);
Singleton.getInstance().getRepeat();
【讨论】:
不确定我是否关注。只是想指出,我真的很感谢你试图帮助我。以上是关于更改语言而不重新启动活动的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行时更改日志级别而不重新启动 Spring Boot 应用程序
如何在 C# 中应用 Windows 任务栏更改而不重新启动资源管理器?