2010-08-02 15 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 문을 사용하지 않으려합니다 (단순히 다른 활동에 끼워 넣을 수는 없습니다/그렇게 할 추상 클래스를 만들 수는 없습니다).


현재 모든 메뉴는 메뉴/*. xml 파일에 설명되어 있으므로 코드를 복제하지 않아도됩니다. 누구에게 아이디어가 있습니까? 첫 번째 대답에

우려 :

  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

나는 그것을했다. (나는 값 -xx/string.xml과 values ​​/ string.xml을 의미한다). menu-xx/mymenu.xml을 생성 하시겠습니까? – davs

+0

따라서, menu_about이라는 문자열을 갖는 values-xx/string.xml과 menu_about이라는 문자열을 갖는 values-yy/string.xml이 있습니다. 휴대 전화의 로케일을 yy로 설정했는데 문자열 값이 yy로 변경되지 않았습니까? 어떤 로케일로 테스트하고 있습니까? http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch 협상을 통해 사용하는 값을 결정하는 방법에 대해 로캘을 올바르게 구성하지 않았을 수 있습니다. –

+0

en/ru 로케일로 테스트하고 있습니다. 그러나 활동을 파괴하지 않았으므로 메뉴가 업데이트되지 않았습니다. 그래서 메뉴를 지우고 처음부터 만들어 내기로 결정했습니다. – davs

0

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

메뉴를 만들 때 문자열을 삽입하고 지역화하십시오.

+0

메뉴는 수명 주기로 인해 각 활동에 대해 메뉴 만 생성한다는 것을 알고 있습니다. 내가 만드는 로컬 리 제이션과 아무런 문제가 ..메뉴가 생성되었을 때 문제가 생겼습니다. 그런 다음 응용 프로그램의 로케일을 변경했는데 메뉴를 다시로드하려고합니다 (아마도 파괴하고 다시 만듭니다.). – davs

+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

+0

나는 나쁜 습관을 믿는 그런 식으로 메뉴를 만들고 싶지 않습니다. – davs