轮换后Android语言会发生变化

时间:2015-11-05 10:16:31

标签: android android-configchanges

安装我的应用程序后,首次运行时会要求用户选择语言;但是如果用户第二次启动应用程序,则会自动设置语言(以前选择的语言)。

问题是,在用户选择语言的第一次运行时,app仍然是英文(无论用户选择何种语言),但如果我旋转设备,则语言被更改为正确的(到选定的一个)。应用程序第二次运行时出现同样的问应用程序以英语启动,但在轮换语言更改为正确之后。

有什么建议吗?提前谢谢你

这里是我更改语言的MainActivity代码:

let renderCommandEncoder = renderer.currentRenderCommandEncoder!
renderCommandEncoder.setVertexBuffer(buffer2, offset: 0, atIndex: 2)
renderCommandEncoder.endEncoding()

这里是来自设置的代码片段:

private void initApp() {
        if (Settings.getLanguage().equals("")){ 
            String[] items = { getResources().getString(R.string.lang_eng), getResources().getString(R.string.lang_geo)};
            showDialogSingleChoise(items, getResources().getString(R.string.select_language_title), 0, false, false, this.languageSelectedListener, this.languageConfirmedListener, null);
        } else {        
            System.out.println("initApp: " + Settings.getLanguage());

            Settings.setLanguage(MainActivity.this.getResources(), Settings.getLanguage());
            appVersionCheck();
        }
    }

private OnClickListener languageConfirmedListener = new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        Settings.setLanguage(MainActivity.this.getResources(), MainActivity.this.language);
        appVersionCheck();
    }
};

这是我的Application类:

public static void setLanguage(Resources res, String langString){
        System.out.println("lang in pref: " + langString);
        setStringProperty(PREFS_LANG ,langString);
        MainApp.getInstance().setLocale(res);
    }

最后,这是显而易见的(我需要android:configChanges =" locale"根本吗?):

public class MainApp extends Application {
    private static volatile MainApp instance;

    public static MainApp getInstance() {
        return MainApp.instance;
    }

    @Override
    public void onCreate() {
        MainApp.instance = this;
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setLocale(this.getResources());
    }

    public void setLocale(Resources res) {
        System.out.println("initApp: " + Settings.getLanguage() == "" ? Settings.LANG_EN : Settings.getLanguage());
        Configuration conf = res.getConfiguration();
        conf.locale = new Locale(Settings.getLanguage() == "" ? Settings.LANG_EN : Settings.getLanguage());
        res.updateConfiguration(conf, res.getDisplayMetrics());
    }
}

3 个答案:

答案 0 :(得分:3)

活动 重新启动之前,您的配置无法应用,因此当您点击更改区域设置时,无法立即应用,但是当您旋转屏幕时因此重新启动会应用您的配置更改。

您应该在单击以更改区域设置后手动重新启动活动,这是一个重新启动活动的代码演示:

private void restartActivity() {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
    }

我认为您不应该在应用程序类中编写更改的区域设置代码,它应该写在您用来更改区域设置的Activity中。

至于在将来的应用程序开放中应用新的语言环境,您可以使用SharedPreferences保存配置,并在每次打开应用程序时获取语言环境值并将其应用。

您可以获取SharedPreferences并在应用程序类的 onCreate()方法中应用区域设置。

你当然应该在你的清单中写android:configChanges="locale|orientation"并且onConfigurationChanged()方法也是必要的。因为如果你旋转屏幕或做任何改变可以重启你的Activity的系统配置的事情,将应用默认语言环境。因此,每次更改配置时都应确保应用新语言环境。

有关如何处理区域设置更改的更多详细信息,请参阅:How to refresh activity after changing language (Locale) inside application

答案 1 :(得分:1)

我在应用中覆盖我的ConfigChange,如下所示,我每次configurationChanged调用setLocale函数:

public class AioApplication extends Application {

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setLocale(LocaleUtility.getLocale());
    }

    @Override
    public void onCreate() {
        super.onCreate();

        LocaleUtility.initialize(this);
    }



    private void setLocale(Locale locale) {
        Configuration conf = getBaseContext().getResources().getConfiguration();
        conf.locale = locale;
        getBaseContext().getResources().updateConfiguration(conf, getResources().getDisplayMetrics());
        Configuration systemConf = Resources.getSystem().getConfiguration();
        systemConf.locale = locale;
        Resources.getSystem().updateConfiguration(systemConf, Resources.getSystem().getDisplayMetrics());
        Locale.setDefault(locale);
    }

}

答案 2 :(得分:0)

您的tr似乎更新了应用的配置。但您已要求使用setLocale

手动处理配置更改

如果删除该行,则配置更改可能有效。

我认为您可以删除的一件事是您的应用程序对象中的android:configChanges="locale"方法。这不会导致你目前无限循环吗?

更新:看起来像手动更改区域设置配置不会导致活动重新启动。看看这个:Changing Locale within the app itself 虽然如果可以的话,我会非常小心使用onConfigurationChange