2013-08-21 172 views
5

我希望我的语言能够动态更改,我尝试使用onConfigurationChanged,但它没有被调用。我有一个MainActivity来创建我的操作栏和viewpager。我的其余部分是碎片。在我的SettingsFragment中,我有一个按钮来将语言切换到法语。区域设置:onConfigurationChanged不叫

langChange.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View vi) { 
      MainActivity main = (MainActivity)getActivity(); 
      main.langChange(); 
     } 

}); 

然后在我的MainActivity我有

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    if (locale != null){ 
     newConfig.locale = locale; 
     Locale.setDefault(locale); 
     getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics()); 
    } 
} 

public void langChange(){ 
    if(currentLanguage == FRENCH_LANGUAGE){ 
     locale = new Locale("en"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "English"; 
    } 
    else if(currentLanguage == ENGLISH_LANGUAGE){ 
     locale = new Locale("fr"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "French"; 
    } 
    actionBar.setSelectedNavigationItem(actionBar.getTabCount() - 1); //This just puts it back to the settings tab 
} 

onConfigurationChanged不会被调用。在我的表现,我有:

<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="locale"></activity> 

我已经尝试添加没有成功的一个或所有这些选项orientation|keyboardHidden|screenSize

所有这些的原因是因为我想单击按钮时更改actionBar文本和所有其他文本。我有一个单独的法语字符串文件。

任何帮助将是伟大的。

+0

你怎么知道'onConfigurationChanged'没有被调用?你在方法内部的代码周围检查'null',这可能是问题所在。也看看这个问题:http://stackoverflow.com/questions/6457659/android-onconfigurationchanged-not-being-called – Darwind

+0

我添加了断点之前和之后if语句与'Log.d'以及。我知道它没有打这个方法。我也看了上面的问题,那些答案没有解决我的问题 – BigT

回答

4

好的,我仔细研究了一下。

我不知道,为什么onConfigurationChanged方法没有被调用,所以我希望有人能够启发我们这部分。

在我的搜索中,我偶然发现了这个tutorial,它实际上改变了Locale,通过改变配置。

您的代码看起来很像这个教程其实;-)

不管怎么说,关于教程和代码,重要的是这种方法:

private void updateTexts() { 
    txt_hello.setText(R.string.hello_world); 
    btn_en.setText(R.string.btn_en); 
    btn_ru.setText(R.string.btn_ru); 
    btn_fr.setText(R.string.btn_fr); 
    btn_de.setText(R.string.btn_de); 
} 

这就是“神奇”发生;在您更改语言环境后,您需要重新加载资源,并且由于您告诉Android您想要自行处理某些配置,因此需要重新加载所有文本,方法是再次设置UI项目文本。

完成后,应用程序将加载特定区域设置文件夹中的字符串。

这个问题的答案,为什么Android的行为这种方式,可以在official documentationActivity找到他说:

[...]

这样做是因为任何应用程序的资源,包括布局文件,可以根据任何配置值进行更改。因此,处理配置更改的唯一安全方法是重新检索所有资源,包括布局,可绘制和字符串。因为活动必须已经知道如何保存其状态并从该状态重新创建自己,所以这是通过新配置使活动自行重新启动的便捷方式。

的家伙写的教程还跟整个教程项目添加为下载,所以我建议你去看看,看看它是如何工作的,因为它工作;-)您可以outcomment的onConfigurationChanged方法,因为它似乎没有做任何事情。

希望这会有所帮助。

+0

你是找到这个问题的上帝。这十分完美。我需要做的一些改变,以适应我的代码,但完美的作品!谢谢 – BigT

+0

任何时候 - 我喜欢挖掘周围;-) – Darwind

6

为了调用onConfigurationChanged(),您必须定义android:configChanges =“layoutDirection | locale”。

+0

这实际上不起作用 –

+3

他是完全正确的,添加'layoutDirection'工作,没有没有。 – marco

+0

这也适用于我,你有什么想法背后的背景是什么? –