更改语言而不重新启动活动

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 任务栏更改而不重新启动资源管理器?

从另一个活动重新创建/重新启动活动

横向模式视频活动正在重新启动

在 IntelliJ 中强制重新加载环境变量...而不重新启动?

在sails.js 中更改配置参数而不重新加载服务器