2013-11-03 56 views
0

我已经知道如何更改我的应用程序的语言(更新配置)。我的代码还检查配置是否被系统改变,并在'onCreate'方法中“修复”。我甚至创建了一个ListPreference来让用户用我的应用程序支持的语言来决定语言(并保存决定)。更改语言时修复资源

比方说,我有3个活动(A,B和SettingsActivity)。活动A可以启动活动B和设置活动。活动B可以启动SettingsActivity。如果用户更改内部SettingsActivity的语言,我可以使用此代码没有任何问题更新其资源(在这种情况下字符串):

//if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) { 
// Disabled because it blinks and looks bad 
// recreate(); 
// } else { 
    startActivity(getIntent()); 
    finish(); 
    overridePendingTransition(0, 0); 
// } 

不过,我无法改变已经打开的活动,因为我没有从SettingsActivity引用它们。

我的问题:是否有任何干净的方式来更新资源或重新创建已经开放的活动?如果我没有找到一个更好的解决办法,我的做法将是上述之一:

  1. 开始活动使用startActivityForResult并返回代码触发我已经使用重新创建活动的代码。
  2. 检查onResume方法的内部是否当前的语言已更改并执行相同的操作。
+0

[更改应用程序本身内的区域设置]的可能重复(http://stackoverflow.com/questions/2264874/changing-locale-within-the-app-itself)。为了重新创建'Activity',我使用了'onResume()'方法。 –

+0

我已经阅读过这个问题,大部分答案和我的问题都不是重复的。 – gian1200

+0

[这个答案](http://stackoverflow.com/a/4881721/2821954)是我在我的应用程序中使用的。基本上,对于每个可以访问Activity的设置的Activity,都可以在'onCreate()'中添加一个变量来存储当前的语言(比如'Locale'或'String'等等)。然后,覆盖'onResume()'来检查语言是否改变。如果是,请重新创建“活动”。 –

回答

0

在结束我所做的就是这样的:

@Override 
protected void onStart() { 
    super.onStart(); 
    if (!locale.equals(getResources().getConfiguration().locale)) { 
     finish(); 
     startActivity(getIntent()); 
     overridePendingTransition(0, 0); 
     return; 
    } 
} 

locale是我onCreate方法分配一个变量:

private Locale locale; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ((Application) getApplication()).refreshLanguage(); 
    locale = getResources().getConfiguration().locale; 
    setContentView(R.layout.activity_main); 
    //moar code 
} 

最后,张贴代码的缘故,在这里是我的refreshLanguage方法(S):

boolean refreshLanguage() { 
    return refreshLanguage(PreferenceManager.getDefaultSharedPreferences(this)); 
} 

boolean refreshLanguage(SharedPreferences sharedPreferences) { 
    if (sharedPreferences.contains("language")) { 
     int languageIndex = Integer.parseInt(sharedPreferences.getString("language", "0")); 
     if (!getResources().getConfiguration().locale.equals(languages[languageIndex])) { 
      Configuration config = new Configuration(); 
      config.locale = languages[languageIndex]; 
      getResources().updateConfiguration(config, null); 
      return true; 
     } 
    } 
    return false; 
} 

请注意,我使用onStart而不是onResume,因为我没有在透明活动或使用对话框之间切换。