2012-09-01 102 views
16

我想讓用戶使用微調器(或任何方式)更改我的應用程序的語言。 我嘗試了很多方法,但他們改變了這個活動的語言,不是所有的活動,我想保存它,所以當用戶重新啓動應用程序時,他會找到最後選擇的語言。Android如何在運行時更改應用程序語言

回答

31

你可以使用在轉你想

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

+0

這會改變整個android系統中的lang還是隻會改變應用程序?我這樣問,以便當用戶離開應用程序時,他們將能夠繼續使用android默認lang –

+0

@KarueBensonKarue,它將僅在應用程序中更改。 –

+0

很好,感謝您的回覆 –

5

使用SharedPreferences跟蹤用戶選擇的語言,然後將活動設置爲在onCreate()和onResume()方法中使用該語言。通過這種方式,將整個應用程序重新啓動等堅持

+1

做所有開發者在這裏應用程序使用這種方式,我覺得它不是很清楚! –

+1

我無法爲其他開發者說話,因爲我無法訪問他們的代碼 –

+1

嗯,是的,這是將您在一項活動中的信息傳遞給其他活動的建議和更簡潔的方法。另一種方法是將數據保存爲活動中的靜態字段,並從其他活動中訪問它,但如果有人問起,我沒有告訴你! :) –

2

這是一個古老的問題,但無論如何我都會回答: - ) 您可以擴展應用程序類以在每個活動上應用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的應用程序類:創建類

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

您可以設置郎值(在你的微調):

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

根據[文檔](https://developer.android.com/reference/android/app/Application.html#onCreate()),應用程序啓動時僅調用Application onCreate() 。所以你不是真的在運行時改變語言,但是在下一個應用程序啓動時,對吧?編輯:重新閱讀原始問題,你的方式畢竟解決了問題。 – Micha

1
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(); 
} 

我們使用兩種語言用於測試目的。將所有字符串保存在不同的文件夾名稱值和值-bn中。