我必须在Android中更改运行时的语言(是的,我知道这不是一个好的行为,但这是一个要求......)。
所以我有一个基本课程,每个活动都会从中扩展。该类具有以下功能:
public static void changeLanguage(Context context) {
Resources res = context.getResources();
/*
* Change locale settings in the app.
*/
DisplayMetrics dm = res.getDisplayMetrics();
/*
* Store and load data in this preferences
*/
android.content.res.Configuration conf = res.getConfiguration();
String[] localArray = res.getStringArray(R.array.language_short_array);
if (localArray != null) {
SharedPreferences settings = context.getSharedPreferences(
MyService.APP_ID, MODE_PRIVATE);
conf.locale = new Locale(localArray[settings.getInt(
PREFERED_LANGUAGE_KEY, 0)]);
res.updateConfiguration(conf, dm);
}
}
我将在onCreate中调用此方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
changeLanguage(this);
}
这是超级班。我的活动从它开始,并首先调用super.onCreate。在此次通话之后,他们设置了布局并初始化了他们的设置......
我认为我的代码行会成功。但我有以下问题:有时,活动会改变语言,有时候不会改变!
如果我在其上设置调试断点并且在程序暂停后按下继续,一切正常。所以我认为,在某些情况下,我的应用程序“足够慢”,语言会正确改变,而如果应用程序太快,语言也不会改变......
我的问题有解决办法吗?我怎么能确定,我的语言会随时改变?
非常感谢!
编辑:这是一个从我的超类
扩展的类的示例public class MainMenuActivity extends BaseActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
}
}
答案 0 :(得分:3)
changeLanguage(this);
。res.updateConfiguration(conf, dm);
更新全局配置,并且特定于您的应用实例而不是您的活动实例。
当您更改locale
中的Activity
时,您必须重新创建Activity
以查看语言更改。这可以通过强制方向更改然后强制它返回来轻松完成:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
如果您在语言更改后回复,则会看到旧语言,因为未调用onCreate
。您必须在onResume
中检测到语言已更改并强制重新创建Activity
。
- =编辑= -
使用屏幕方向重新加载Activity
已被证明在某些设备上有点儿麻烦。我现在用它来重新加载当前的Activity
:
public static void resetScreen(Activity activity) {
if (activity != null) {
if (Build.VERSION.SDK_INT >= 11) {
activity.recreate();
} else {
Intent intent = activity.getIntent();
activity.overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
activity.finish();
activity.overridePendingTransition(0, 0);
activity.startActivity(intent);
}
}
}
答案 1 :(得分:0)
我认为你需要发布一个扩展你的超类的Activity的例子。但是,在onCreate()中调用changeLanguage对我来说似乎很可疑。只有在首次初始化应用程序时才会运行。要在加载应用程序后更改语言,您必须停止并重新创建它。