Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 强制使用不同的区域设置仅适用于后堆栈中的顶级活动_Android_Configuration_Locale - Fatal编程技术网

Android 强制使用不同的区域设置仅适用于后堆栈中的顶级活动

Android 强制使用不同的区域设置仅适用于后堆栈中的顶级活动,android,configuration,locale,Android,Configuration,Locale,关于应用程序本地化,我遇到了一个小问题: 这里是一个例子——我给了我的用户一个选项,无论系统语言如何,都可以始终使用挪威语的应用程序 它在大多数情况下都可以正常工作(我进入设置,选中框强制使用挪威语,按“后退”键,上一个活动将以挪威语显示-这与“另一种方式”相同),但是-语言更改似乎只能正确更新(重新加载资源)我的“后堆栈”中的第一个活动 要说明一个典型场景,请执行以下操作: 用户启动应用程序,并显示主要活动(英语)。从那里,他选择第二个活动(也是英语)。然后,他进入设置(从第二个活动中的菜单)

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

这里是一个例子——我给了我的用户一个选项,无论系统语言如何,都可以始终使用挪威语的应用程序

它在大多数情况下都可以正常工作(我进入设置,选中框强制使用挪威语,按“后退”键,上一个活动将以挪威语显示-这与“另一种方式”相同),但是-语言更改似乎只能正确更新(重新加载资源)我的“后堆栈”中的第一个活动

要说明一个典型场景,请执行以下操作:

用户启动应用程序,并显示主要活动(英语)。从那里,他选择第二个活动(也是英语)。然后,他进入设置(从第二个活动中的菜单)并将首选项设置为强制挪威语

然后,当他返回时,第二个活动将正确更新并以挪威语显示(目前为止效果良好)。然而,当他再次按“后退”返回到主要活动时,它仍然以英语显示

如果他返回并再次启动应用程序,则主要活动将以挪威语正确显示

这里有没有聪明人建议我该怎么做

相关源代码: 每个活动中包含的用于设置显示语言的代码:

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

Globals.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;
        }
    }
}
我想是这条线

  Configuration config = a.getBaseContext().getResources().getConfiguration();
getBaseContext()
只能从另一个活动中获取对该活动的引用。因此,这就是为什么当您返回到上一个活动而不是主应用程序时,它会反映更改的原因


使用
getApplicationNext()
,而不是反映整个应用程序的更改。这将把更改与应用程序的整个生命周期联系起来,因此应用程序中的每个活动都可能是由于boolean Globals.language_的更改是静态的,因此当从顶部活动调用languageCheck时,在从后台活动调用languageCheck之前,此布尔值变为false。您可以进行一些检查,以查看层次结构中早期的Activit是否打开,如果打开,请将布尔值设置为true,以防用户按下“后退”按钮。另一个选项是一些逻辑,当选择了新的区域设置时,会立即重新加载所有打开的活动

--编辑-- 在进一步的检查中,我认为这不是您的问题,因为您还在为每个活动更新onStart中的布尔值(我第一次阅读时错过了这一部分)。当堆栈中较高的一个活动更改了区域设置时,该区域设置可能会更改,但堆栈中较低的活动只需要刷新即可。一项低级活动的方向改变是否会将其从英语改为挪威语

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

if( !config.locale.equals( locale ) )
如果这就是问题所在,那么一个可能的解决方案是在每个活动中保存本地语言环境实例,而不是全局实例,并与该实例进行比较。例如,您可以在每个活动的onCreate方法中获取区域设置实例:

myLocale = getBaseContext().getResources().getConfiguration().locale;
然后,不调用Globals.checkLocal,只需执行以下条件语句(在每个活动的languageCheck方法中):


重新启动时,将再次调用活动的onCreate方法,这将将myLocale更新为正确的值。这只是一个快速的解决方案,不一定是最好的。。例如,如果您愿意,您可以在此基础上进行扩展,将其中一些代码移动到Globals中的方法中,或者使用不同于onCreate的位置来获取每个活动的本地语言环境实例。

不起作用(尽管我不明白这有什么关系,因为此代码是从应用程序中的每个活动调用的)-仍然表现相同…方向更改确实会导致它重新加载并正确更改语言-但是我故意强制应用程序保持纵向模式(当前UI在横向中没有意义,我还没有创建另一个版本)。虽然我听到其他人建议“欺骗”活动,使其认为轮换已经改变,以便重新加载资源-知道这方面的事情吗?我不知道如何欺骗方向的改变,但您仍然需要知道何时进行欺骗。如果您知道这一点,那么您可以重新启动活动,而不是进行欺骗式的方向更改。我还没有在“编辑2”下测试我的建议。。我认为这并没有解决问题?对不起,我已经有一段时间没有活动了(有一些私人的事情发生了)。。。我试图为
if(!config.locale.equals(locale))
添加一个通知程序(为了简单起见使用了Toast),但该语句似乎返回false。我将尝试您的解决方案并向您报告。:)成功了——先生,你真是个天才现在剩下的就是一些代码清理。。。
myLocale = getBaseContext().getResources().getConfiguration().locale;
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 );
}