- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到了一个关于应用程序本地化的小问题:
情况是这样的 - 我已经为我的用户提供了一个选项,让他们始终使用挪威语的应用程序,而不管系统语言如何。
它在大多数情况下工作得很好(我进入设置,选中强制挪威语的框,按“返回”,之前的 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/
出于好奇 - 我知道有 LAMP - Linux、Apache、MySQL 和 PHP。但是还有哪些其他 Web 堆栈替代方案的缩写呢?像 LAMR - Linux、Apache、MySQL Ruby
我有以下代码。 var stackMapIn = []; var stackMapOut = []; var stackBack = []; stackMapOut.push("m1"); $scop
我遇到了导致我的堆栈无法恢复的情况,我别无选择,只能将其删除。使用完全相同的模板,我继续创建了另一个同名的堆栈。 The following resource(s) failed to create:
这是我第一次查看 Node 堆栈,自从我学习使用 Ruby on Rails 进行 Web 开发以来,我对一些基本的东西有点困惑。我了解 Rails 目录是什么样的。 demo/ ..../app .
本文实例讲述了C语言使用深度优先搜索算法解决迷宫问题。分享给大家供大家参考,具体如下: 深度优先搜索 伪代码 (Pseudocode)如下: ?
我正在按照指南 here ,它告诉我: The stack setup will download the compiler if necessary in an isolatedlocation (
同时 trying to debug a different question ,我安装了一个似乎与我安装的其他一些软件包冲突的软件包。 我跑了 $ stack install regex-pcre-
我花了几个小时创建了一个方法,该方法将从堆栈 s1 中获取 null 元素,并将它们放入 s2 中。然后该类应该打印堆栈。方法如下 import net.datastructures.ArraySta
我有一个类Floor,它有一个Stack block ,但我不知道如何初始化它。我曾尝试过这样的: public class Floor { private Stack stack;
我知道这个问题已经问过很多次了,但搜索一个小时后我仍然遇到问题。 我想使用一个 lifo 堆栈,它可以存储最大数量的元素。达到最大数量后,首先删除该元素并将其替换为新元素,这样在第一次弹出时我可以获取
我需要编写一个方法,压缩以执行以下操作; 目标compress方法是从栈s1中移除所有null元素。剩余(非空)元素应按其初始顺序保留在 s1 上。辅助堆栈 s2 应用作s1 中元素的临时存储。在该方
我正在尝试验证以下代码发生的顺序。 function square(n) { return n * n; } setTimeout(function(){ console.log("H
我需要一个字符数组,其中包含基于特定文件夹中文件数量的动态数量的字符数组。我能够通过初始化 char (*FullPathNames)[MAX_FILENAME_AND_PATHNAME_LENGTH
我正在编写一些日志逻辑并想要进行一些缩进。了解是否存在任何函数调用或某个函数是否已完成的最简单方法是查看堆栈/帧的当前地址。让我们假设堆栈颠倒增长。然后,如果 log() 调用中的堆栈地址小于前一次调
所以内存分段在x86-64中被放弃了,但是当我们使用汇编时,我们可以在代码中指定.code和.data段/段,并且还有堆栈指针寄存器。 还有堆栈段、数据段和代码段寄存器。 代码/数据/堆栈的划分是如何
void main() { int x = 5; // stack-allocated Console.WriteLine(x); } 我知道 x 是堆栈分配的。但是关于 x 的堆栈中
这是我关于 SO 的第一个问题。这可能是一个愚蠢的问题,但到目前为止我还没弄明白。 考虑下面的程序 Reader.java: public class Reader { public
java中有没有一种快速的方法来获取嵌套/递归级别? 我正在编写一个函数来创建组及其成员的列表。成员也可以是团体。我们最终可能会得到一组循环的组/成员。 我想在某个任意级别停止。 我知道我可以将变量保
考虑以下代码: struct A{...}; A a[100]; A* pa = new A[100]; delete[] pa; a/pa 元素的销毁顺序是由标准定义的还是实现定义的(对于第二种情况
我在下面有一些代码。此代码是一个基本的压入/弹出堆栈类,我将其创建为模板以允许某人压入/弹出堆栈。我有一个家庭作业,我现在要做的是创建一个具有多个值的堆栈。 所以我希望能够创建一个基本上可以发送三个整
我是一名优秀的程序员,十分优秀!