2013-04-18 129 views
2

我必須在Android中更改運行時的語言(是的,我知道這不是一個好的行爲,但這是一個要求...)。在Android中更改運行時語言

所以我有一個基本的類,每個活動從中延伸。此類具有以下功能:

public static void changeLanguage(Context context) { 
    Resources res = context.getResources(); 
    /* 
    * Change locale settings in the app. 
    */ 
    DisplayMetrics dm = res.getDisplayMetrics(); 

    /* 
    * Store and load data in this preferences 
    */ 
    android.content.res.Configuration conf = res.getConfiguration(); 
    String[] localArray = res.getStringArray(R.array.language_short_array); 
    if (localArray != null) { 
     SharedPreferences settings = context.getSharedPreferences(
       MyService.APP_ID, MODE_PRIVATE); 
     conf.locale = new Locale(localArray[settings.getInt(
       PREFERED_LANGUAGE_KEY, 0)]); 
     res.updateConfiguration(conf, dm); 
    } 
} 

我會調用這個方法的onCreate:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    changeLanguage(this); 
} 

這是超一流的。我的活動從此延伸並首先致電super.onCreate。在這次通話之後,他們設置了他們的佈局並初始化了他們的設置...

我以爲我的代碼行可以做到。但我有以下問題:有時候,活動會改變語言,有時候不會!

如果我在它上面設置了一個調試斷點,並在程序暫停後按下繼續,一切正常。所以我認爲,在某些情況下,如果我的應用程序「足夠慢」,語言將會正確更改,而如果應用程序速度太快,語言不會改變...

有沒有我的問題的解決方案?我怎麼能確定,我的語言在任何時候都能正確改變?

非常感謝!

編輯:這是從我的超類擴展一個類的實例

public class MainMenuActivity extends BaseActivity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_start); 
    } 
} 

回答

3

changeLanguage(this);僅當語言發生變化或應用程序加載時才需要調用更新全局配置並且特定於您的應用程序實例而不是您的活動實例。

當您在Activity中更改locale時,必須重新創建Activity以查看您的語言更改。這可以通過強制改變方向時再迫使它回到這樣很容易做到:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

如果你還擊語言改變後,你將看到舊的語言,因爲onCreate不叫。您必須在onResume中檢測到語言已更改並強制重新創建Activity

- =編輯= -

使用屏幕方向重新加載Activity已被證明是在某些設備上有點馬車。我現在用這個來重新加載當前的Activity

public static void resetScreen(Activity activity) { 
    if (activity != null) { 
     if (Build.VERSION.SDK_INT >= 11) { 
      activity.recreate(); 
     } else { 
      Intent intent = activity.getIntent(); 
      activity.overridePendingTransition(0, 0); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      activity.finish(); 

      activity.overridePendingTransition(0, 0); 
      activity.startActivity(intent); 
     } 
    } 
} 
0

我認爲你需要發佈,擴展您的超活動的一個例子。雖然在onCreate()中調用changeLanguage似乎對我很可疑。這隻會在應用程序初次初始化時運行。要在加載應用後更改語言,您必須停止並重新創建它。

+0

嘿。我已經添加了一個例子。它只是調用onCreate並設置內容視圖。有時它起作用,有時它不起作用。當我在setContentView中設置一個斷點並繼續時,它肯定會起作用 – Frame91