2

我必须在 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);
    }
}
4

2 回答 2

3

changeLanguage(this);仅在语言更改或加载应用程序时才需要调用..res.updateConfiguration(conf, dm);更新全局配置并且特定于您的应用程序实例而不是您的活动实例。

当您更改localein 时,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);
        }
    }
}
于 2013-04-19T22:01:09.430 回答
0

我认为您需要发布一个扩展超类的 Activity 示例。不过,在 onCreate() 中调用 changeLanguage 对我来说似乎很可疑。这只会在应用程序首次初始化时运行。要在您的应用程序加载后更改语言,您必须停止它并重新创建它。

于 2013-04-18T17:51:29.620 回答