2012-10-16 37 views
1

我對Android開發很陌生,而且我有一點本地化問題。 我有一個應用程序,用戶可以選擇使用除設備當前語言之外的其他默認語言。 例如,居住在德國並且手機設置爲「德語」的法國用戶可能希望以法語使用我的應用程序(出於各種原因),但不要使用法語設置其手機的默認語言。android如何正確設置應用程序的默認語言,即使在關閉設備後也是如此

我的應用程序只有一個活動,我加載和卸載一些視圖。 這是一個非常簡單的應用程序,但內容很大(文本和圖像)。

要做到這一點,我使用下面的代碼。

它運作良好,但也存在一些問題:

  • 當用戶選擇了一種新的語言與相應的按鈕,並重新啓動應用程序(或者,如果我強迫應用程序來完成().. 。):只有第一個視圖使用新的語言。下一個視圖仍然設置爲以前的語言。

  • 如果用戶選擇關閉他的設備,同樣的問題:只有活動的第一個視圖設置爲選擇的語言(該變量從首選項中讀取)。

  • 但是,如果用戶選擇第二次重新啓動應用程序,則所有視圖和子視圖都會正確設置爲新語言。

  • 另外,如果用戶之前已重新啓動應用至少一次,則每次語言更改都已成功完成。無需第二次重新啓動應用程序。

那麼,有沒有一種方法來應用

  • 的第一重新開張後正確設置新的語言

    • 立即如果用戶之前已經轉向和他的設備上

    任何幫助將不勝感激。 這裏是我使用的代碼(簡化):

    public void onCreate(Bundle savedInstanceState) { 
        SharedPreferences myPrefs; 
        myPrefs = getSharedPreferences("langage", MODE_PRIVATE); 
        String langageToLoad = myPrefs.getString("langageToLoad", ""); 
        changeLangage(langageToLoad); 
    
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        (...some other code...) 
        } 
    
    public void setLangageEn(View view){ 
        changeLangage("en"); 
        setPreference("en"); 
        // finish(); // optionnal 
        } 
    
    public void changeLangage(String langage) { 
        Locale locale = new Locale(langage); 
        Locale systemLocale = Locale.getDefault(); 
        if (systemLocale != null && systemLocale.equals(locale)) { 
        return; 
        } 
        Locale.setDefault(locale); 
        android.content.res.Configuration config = new android.content.res.Configuration(); 
        config.locale = locale; 
        getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 
        } 
    
    public void setPreference(String langage){ 
        SharedPreferences languagepref = getSharedPreferences("langage",MODE_PRIVATE); 
        SharedPreferences.Editor editor = languagepref.edit(); 
        editor.putString("langageToLoad",langage); 
        editor.commit(); 
        } 
    
  • 回答

    0

    以下的事情:只是因爲你完成()一個活動,以前的活動並不需要關閉,併爲此可能調用的onResume()和剛「跳過」onCreate(),它們還沒有脫離內存,不要調用onCreate()(它在onResume()之前),在那裏實現語言檢查。


    有一兩件事要避免這個問題,可能是創建一個自定義的「應用類」(擴展應用),並在那裏,檢查本地化偏好,並與getter和setter方法設置爲一個字段。爲了獲得應用程序實例(在應用程序開始時創建(不是在剛開始第二個活動時創建的..),您可以在您的活動中執行((CustomApp)Context.getApplicationContext).getCustomLocalization()..

    然而。要真正加載每個活動中的新語言設置,請務必在onResume()中檢查它並將Custom語言設置爲CustomApp中的字段並將其設置爲2.在更改時設置首選項(也許使用相同的setter方法?) 。然後完成()您的設置活動並重新創建它以加載新設置。

    相關問題