【问题标题】:Android how to change the application language at runtimeAndroid 如何在运行时更改应用程序语言
【发布时间】:2012-09-01 19:05:21
【问题描述】:

我想让用户使用微调器(或任何方式)更改我的应用程序的语言。 我尝试了很多方法,但他们改变了这个活动的语言,而不是所有活动,我想保存它,这样当用户重新启动应用程序时,他会找到最后选择的语言。

【问题讨论】:

    标签: android runtime


    【解决方案1】:

    您可以在微调器中使用此代码或任何您想要的方式

    String languageToLoad  = "en"; // your language 
    Locale locale = new Locale(languageToLoad);  
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,  
    getBaseContext().getResources().getDisplayMetrics());
    

    那么你应该像这样保存语言

    SharedPreferences languagepref = getSharedPreferences("language",MODE_PRIVATE);
    SharedPreferences.Editor editor = languagepref.edit();
    editor.putString("languageToLoad",languageToLoad );
    editor.commit();  
    

    并在 onCreate() 中的每个活动中使用相同的代码从 SharedPreferences 加载 languageToLoad

    【讨论】:

    • 这会改变整个安卓系统的语言还是只改变应用程序?我问这个,以便当用户离开应用程序时,他们将能够继续使用 android 默认语言
    • @KarueBensonKarue 它只会在应用程序中改变。
    【解决方案2】:

    这是一个老问题,但无论如何我都会回答:-) 您可以扩展 Application 类以在每个 Activity 上应用 Abol3z 的解决方案。创建类:

    public class MyApplication extends Application {
    
       @Override
       public void onCreate() {
           super.onCreate();
           SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
           String lang = preferences.getString("lang", "en");
           Locale locale = new Locale(lang);
           Locale.setDefault(locale);
           Configuration config = new Configuration();
           config.locale = locale;
           getBaseContext().getResources().updateConfiguration(config,
                   getBaseContext().getResources().getDisplayMetrics());    
       }  
    }
    

    并将 MyApplication 设置为 manifest 中的应用程序类:

     <application
            android:name=".MyApplication"
            ...
     />
    

    您可以设置 lang 值(在您的微调器中):

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
    preferences.edit().putString("lang", "en").commit();
    

    【讨论】:

    • 根据documentation,应用程序 onCreate() 仅在应用程序启动时调用。所以你并没有真正在运行时改变语言,而是在下一个应用程序启动时,对吗?编辑:重新阅读原始问题,您的方式毕竟解决了问题。
    【解决方案3】:

    使用 SharedPreferences 来跟踪用户选择的语言,然后在 onCreate() 和 onResume() 方法中设置活动以使用该语言。这样,它将在应用重启等过程中持续存在。

    【讨论】:

    • 是否所有开发者都在应用中使用这种方式,我觉得不是很清楚!
    • 我不能代表其他开发人员,因为我无法访问他们的 codem
    • 嗯,是的,这是将您在一个活动中拥有的信息传递给其他活动的推荐且更简洁的方式。另一种更 hacky/不正确的方法是将数据作为静态字段保存在 Activity 中,并从其他 Activity 访问它,但如果有人问,我没有告诉你! :)
    • 对不起,我的意思是这是官方的方式。因为我需要最好的方法来做到这一点。如果你知道请告诉我
    • 我做到了。这是一个不错的、官方且干净的 API,您可以使用它在活动和应用重新启动之间保留数据。
    【解决方案4】:
    btnChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
                //preferences.edit().putString("lang", "bn").commit();
    
                String lang = preferences.getString("lang", "en");
                //Log.e("lang", "lang in Main Activity:"+lang);
                if (lang.equalsIgnoreCase("en")){
                    setLocale("bn");
                    preferences.edit().putString("lang", "bn").commit();
                    btnChange.setText("Eng");
                }else if(lang.equalsIgnoreCase("bn")){
                    setLocale("en");
                    preferences.edit().putString("lang", "en").commit();
                    btnChange.setText("বাংলা");
                }
            }
        });
    
    
    public void setLocale(String lang) {
    
        myLocale = new Locale(lang);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        Intent refresh = new Intent(this, MainActivity.class);
        startActivity(refresh);
        finish();
    }
    

    我们使用两种语言进行测试。将所有字符串保存在名为 values 和 values-bn 的不同文件夹中。

    【讨论】:

    • conf.locale = myLocaleres.updateConfiguration(conf, dm); 现已弃用
    • 你不能使用重新创建而不是重新启动活动吗?
    猜你喜欢
    • 2014-09-03
    • 2015-12-04
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2015-06-19
    相关资源
    最近更新 更多