gpt4 book ai didi

android - 强制使用不同的语言环境仅适用于返回堆栈中的顶级 Activity

转载 作者:太空狗 更新时间:2023-10-29 15:17:12 24 4
gpt4 key购买 nike

我遇到了一个关于应用程序本地化的小问题:

情况是这样的 - 我已经为我的用户提供了一个选项,让他们始终使用挪威语的应用程序,而不管系统语言如何。

它在大多数情况下工作得很好(我进入设置,选中强制挪威语的框,按“返回”,之前的 Activity 以挪威语显示 - 同样的事情“反过来”),但是 -语言更改似乎只为我的“返回堆栈”中的第一个 Activity 正确更新(重新加载资源)。​​

为了说明一个典型的场景:

User launches the app, and is presented with the main activity (in English). From there, he selects the second activity (also in English). He then goes into settings (from the menu in the second activity) and sets the preference to force Norwegian.

When he then navigates back, the second activity is correctly updated and displayed in Norwegian (so far so good). However, when he presses "back" once more to return to the main activity, it is still displayed in English...

If he goes back out and launches the app again, the main activity is correctly displayed in Norwegian...

这里有没有聪明的人对我应该做什么提出建议?

相关源码:

每个 Activity 中包含的用于设置显示语言的代码:

在 onCreate 中:Globals.locale_default = Locale.getDefault().getDisplayLanguage();

public void onStart() {
super.onStart();
forceNorwegian = settings.getBoolean(getString(R.string.pref_key_forceNorwegian).toString(), false);
if (forceNorwegian) {
languageCheck("no");
} else {
Globals.locale = null;
languageCheck(Globals.locale_default);
}
}

public void languageCheck(String lang) {
Globals.locale = new Locale( lang );
// Check the current system locale and change it to Norwegian if it's not already the default
Globals.checkLocale( this );
if (Globals.language_changed) {
// Restart activity
Intent restart = getIntent();
finish();
Globals.language_changed = false;
startActivity(restart);
}
}

全局变量.java:

public class Globals {

public static Locale locale = null;
public static String locale_default = null;
public static boolean language_changed = false;

public static void checkLocale( Activity a ) {
if( locale == null )
return;

Configuration config = a.getBaseContext().getResources().getConfiguration();
if( !config.locale.equals( locale ) )
{ // Change to the new locale. Everything will need to be closed or reloaded.
config.locale = locale;
a.getBaseContext().getResources().updateConfiguration( config, null );
language_changed = true;
}
}
}

最佳答案

问题可能出在 bool 值 Globals.language_changed 是静态的这一事实,因此当从顶部 Activity 调用 languageCheck 时,此 bool 值在从后台 Activity 调用 languageCheck 之前变为假。您可能会进行一些检查以查看层次结构中较早的 Activit 是否已打开,如果是,则将 bool 值设置为 true 以防用户按下后退按钮。另一种选择是在选择新语言环境时立即重新加载所有打开的 Activity 的逻辑。

-- 编辑 --在进一步检查中,我认为这不是您的问题,因为您还为每个 Activity 更新了 onStart 中的 bool 值(我第一次阅读时错过了这部分)。也许当堆栈中较高的 Activity 之一更改时语言环境发生了变化,但堆栈较低的 Activity 只需要刷新即可。某个较低 Activity 的方向更改是否会将其从英语更改为挪威语?

-- 编辑 2 --检查这是否是问题的最简单方法是在 Globals.checkLocale 中添加一些日志记录以查看此条件语句是否为真:

if( !config.locale.equals( locale ) )

如果这确实是问题所在,那么一个可能的解决方案是在每个 Activity 中保存一个本地 Locale 实例而不是全局实例,然后与那个实例进行比较。例如,您可以在每个 Activity 的 onCreate 方法中获取一个 Locale 实例:

myLocale = getBaseContext().getResources().getConfiguration().locale;

然后,不调用 Globals.checkLocal,只需执行以下条件语句(在每个 Activity 的 languageCheck 方法中):

if( Globals.locale != null && !Globals.locale.equals( myLocale ) )
{
Configuration config = getBaseContext().getResources().getConfiguration();
config.locale = Globals.locale;
getBaseContext().getResources().updateConfiguration( config, null );
Intent restart = getIntent();
finish();
startActivity( restart );
}

重新启动后,将再次调用 Activity 的 onCreate 方法,这会将 myLocale 更新为正确的值。这只是一个快速的解决方案,不一定是最好的解决方案。例如,如果您愿意,您可以对此进行扩展以将一些代码移动到 Globals 中的方法中,或者使用与 onCreate 不同的位置来获取本地 Locale 实例每个 Activity 。

关于android - 强制使用不同的语言环境仅适用于返回堆栈中的顶级 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11705963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com