2013-09-24 6 views
6

Android 앱에서 언어를 수동으로 설정할 필요없이 언어 전환을 구현하려면 어떻게해야합니까? 앱이 시작할 때 로캘에 따라 strings.xml을로드한다는 것을 알고 있지만이 선택을 시스템 로캘을 기반으로하지 않고 대신 설정에서 사용자 지정되도록하고 싶습니다.앱 안의 언어 전환

또는 로케일을 수동으로 설정하고 있습니까?

+0

에 대한 strings.xml의에 저장됩니다 단지 열쇠? 언어가 기기 로캘 설정이 아닌 앱 설정에 따라 변경되기를 원하십니까? –

+0

예, 앱 설정에 따라 앱 언어를 변경하고 싶습니다. –

답변

18

응용 프로그램 클래스를 확장 할 수 있습니다 (매니페스트에서도 선언해야 함). 다음과 같이 입력하십시오. 당신이 언어를 변경할 때마다

당신은 그 활동 내에서

((App)getApplicationContext()).changeLang(lang); 

를 호출 할 수 있습니다. R.string.locale_lang 당신이 더 명확 해주세요 수있는 공유 환경 설정

public class App extends Application { 

    private Locale locale = null; 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(newConfig); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = settings.getString(getString(R.string.locale_lang), ""); 
     changeLang(lang); 
    } 

    public void changeLang(String lang) { 
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 

      Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
      ed.putString(getString(R.string.locale_lang), lang); 
      ed.commit(); 

      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      Configuration conf = new Configuration(config); 
      conf.locale = locale; 
      getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    public String getLang(){ 
     return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), ""); 
    } 



} 
+0

감사합니다. 나는 아이디어를 얻는다. 그러나 어떻게 선언서에 선언해야합니까? 내가 생각하는 활동이 아니야. –

+1

활동으로 아니지만 활동 태그를 묶는 응용 프로그램 태그가 있습니다. 응용 프로그램의 속성으로 android : name = ". App"을 추가해야합니다. – kjurkovic