2010-08-02 47 views
5

我想改變語言(應用環境)編程。Android和菜單本土化

對我來說,主要問題是更新菜單標籤。

我嘗試以下方法:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeMenuLabels) { 
     for (int i = 0; i < menu.size(); i++) { 
      MenuItem menuItem = menu.getItem(i); 
      switch (menuItem.getItemId()) { 
       case R.id.menu_main_about: 
        menuItem.setTitle(R.string.menu_about); 
        break; 
       case R.id.menu_main_preferences: 
        menuItem.setTitle(R.string.menu_prefs); 
        break; 
      } 
     } 
     shouldChangeMenuLabels = false; 
    } 

但我敢肯定它壞主意。我想避免使用switch-case語句,因爲這不是通用方法(我不能簡單地將剪切端口移植到其他活動/我不能創建抽象類來執行此操作)。


順便說一句,所有菜單已被描述到menu/*。xml文件中,所以我不想複製代碼。任何人有想法?

關注到第一個答案:我HAE用下面的代碼地區被改爲:

  Locale locale = new Locale((String)newValue); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      getApplication().getResources().updateConfiguration(config, getApplication().getResources().getDisplayMetrics()); 

但我想控制每個活動旋轉,它們永遠不會結束。也許我做錯了什麼?

回答

5

我不知道它是一個不錯的主意,但我發現下面的方式:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeLocale) { 
     menu.clear(); 
     MenuInflater inflater = getMenuInflater(); // -->onCreateMenu (Menu) 
     inflater.inflate(R.menu.menu_main, menu); ///
     shouldChangeLocale=false; 
    } 

    return super.onMenuOpened(featureId, menu); 
} 

我需要你的意見,我應該這樣做這樣的方式?

0

你有沒有過上Android Localization的文檔閱讀?通常情況下,您需要爲每種您希望支持的語言/語言環境創建不同的字符串文件。在您的menu.xml文件中,您可以引用字符串ID,並根據當前的區域設置選擇適當的值。

+0

我做到了。 (我的意思是values-xx/string.xml和values/string.xml)。你的意思是創建menu-xx/mymenu.xml嗎? – davs 2010-08-03 05:26:16

+0

因此,您使用字符串menu_about爲字符串,menu_about和values-yy/string.xml創建了values-xx/string.xml。您將手機的語言環境設置爲yy,並且字符串值不會更改爲yy?你正在測試哪個區域? http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch談論它如何決定使用哪個值,您可能沒有正確配置您的區域設置。 – 2010-08-03 15:45:20

+0

我正在使用en/ru語言環境進行測試。但由於我沒有銷燬活動,菜單沒有更新。所以,我決定清除菜單並從零開始創建它 – davs 2010-08-03 16:06:44

0

menu.add(0,MENU_ABOUT,0,_mContext.getResources()。getString(R.string.mymenu))。setIcon(R.drawable.ic_menu);

在創建菜單插入你的字符串和本地化它。

+0

據我所知,菜單爲每個活動的生命週期創建一個。由於創建本地化,我沒有任何問題..當菜單已經創建時,我遇到了問題,然後我更改了應用程序的語言環境,並且我想重新加載菜單(也許銷燬它並再次創建它,但我不知道如何銷燬它) – davs 2010-08-03 06:25:32

+0

您可以使用共享首選項和改變你的菜單項的每個選擇 \t \t如果(preferences.getBoolean( 「聲音」,真)) \t \t { \t \t \t \t \t menu.add(0,MENU_SOUND,0, 「聲音」 ).setIcon(R.drawable.on); \t \t} \t \t別的 \t \t { \t \t menu.add(0,MENU_SOUND,0, 「聲音」)的setIcon(R.drawable.off)。 \t \t \t \t \t} – Eby 2010-08-03 09:35:33

+0

我不想創建菜單這樣的方式,因爲我認爲它是一種不好的做法 – davs 2010-08-04 15:05:56