偏好活动中的 Android 更新语言

Posted

技术标签:

【中文标题】偏好活动中的 Android 更新语言【英文标题】:Android update language in preference activity 【发布时间】:2011-12-09 09:31:45 【问题描述】:

在我的 android 应用程序中,我有一个偏好活动,让用户覆盖应用程序的语言。为此,我在每个活动的 onResume() 中调用此函数,然后重置内容视图:

    public static void checkOverrideSystemLanguage(Context context) 
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(context);

    // Check if system's language setting needs to be overridden
    boolean overrideSystemLanguage = prefs.getBoolean(context
            .getString(R.string.pref_key_chkbx_override_system_language),
            false);

    if (overrideSystemLanguage) 

        // Get language selection and possible languages
        String localeString = prefs.getString(
                context.getString(R.string.pref_key_list_languages), "");
        List<String> possibleLanguages = Arrays.asList(context
                .getResources().getStringArray(
                        R.array.pref_values_list_languages));

        if (possibleLanguages.contains(localeString)) 

            // Change language setting in configuration
            Locale locale = new Locale(localeString);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            context.getResources().updateConfiguration(config,
                    context.getResources().getDisplayMetrics());
        
        // Use default language
        else 
            overrideSystemLanguage = false;
        
    

    // Use default language
    if (!overrideSystemLanguage) 
        context.getResources().updateConfiguration(
                Resources.getSystem().getConfiguration(),
                context.getResources().getDisplayMetrics());
    

在每一项活动中,它都运行良好。然而,在偏好活动中,当用户更改语言时,它不会立即更新,因为没有 setContentView() 方法。用户必须返回上一个活动并再次启动首选项活动才能看到反映的语言变化。

我在 onPreferenceChange() 监听器中尝试了以下操作:

    更新配置、删除和读取首选项:

    checkOverrideSystemLanguage(this);      
    // Remove all preferences and add them to update the language
    getPreferenceScreen().removeAll();
    addPreferencesFromResource(R.xml.preferences);
    

    更新配置并调用 onCreate(null)

    完成并重新开始活动

    finish();
    startActivity(new Intent(this, PreferencesActivity.class));
    

感谢您的帮助!

【问题讨论】:

您可以使用一些小技巧并在开头调用的某些方法中调用 getActionBar().setTitle("your title") 【参考方案1】:

我遇到了类似的问题,我以这种方式解决了(如您所说:完成并重新启动活动)。有效!

    public class OptionsActivity extends PreferenceActivity implements YesNoDialogPreference.YesNoDialogListener, SharedPreferences.OnSharedPreferenceChangeListener 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        //Options Setting
        final SharedPreferences prefs = getSharedPreferences(OptionsUtility.PREFERENCE_NAME, MODE_PRIVATE);
        String language = prefs.getString(OptionsUtility.PREFERENCE_LANGUAGE, OptionsUtility.DEFAULT_LANGUAGE);

        //Update locale
        OptionsUtility.updateLanguage(this, language);
        prefs.registerOnSharedPreferenceChangeListener(this);

        getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
        getPreferenceManager().setSharedPreferencesName(OptionsUtility.PREFERENCE_NAME);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);

        Preference eraseGameButton = getPreferenceManager().findPreference(OptionsUtility.PREFERENCE_ERASE_GAME);
        if (eraseGameButton != null) 
            YesNoDialogPreference yesNo = (YesNoDialogPreference)eraseGameButton;
            yesNo.setListener(this);
        

        Preference configureKeyboardPref = getPreferenceManager().findPreference("keyconfig");
        if (configureKeyboardPref != null) 
            //KeyboardConfigDialogPreference config = (KeyboardConfigDialogPreference)configureKeyboardPref;
            //config.setPrefs(getSharedPreferences(MemodroidCoreActivity.PREFERENCE_NAME, MODE_PRIVATE));
            //config.setContext(this);
        

    


    public void onDialogClosed(boolean positiveResult) 
        if (positiveResult) 
            DatabaseScoreManager dbsManager = new DatabaseScoreManager(getApplicationContext());
            dbsManager.resetHighScores();
            Toast.makeText(this, R.string.toast_highScoresReset,Toast.LENGTH_SHORT).show();
        
    


    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) 
        restartActivity();
    

    @Override
    protected void onStop() 
        super.onStop();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    

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

    @Override
    public void onBackPressed() 
        finish();
    

【讨论】:

以上是关于偏好活动中的 Android 更新语言的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio - 共享偏好无法保存在新活动中

活动推荐 | Kotlin 开发者技术沙龙

在偏好活动中静音

我的主要活动中的偏好不会改变

使用操作栏中的图标按钮导航到另一个活动

Android:绝对清除活动