2010-04-15 5 views
23

내 응용 프로그램에 언어 설정이 있습니다. 언어가 전환되면 모든 textviews 등이 즉시 언어를 변경하기를 바랍니다. 현재 구성에서 로케일을 변경하기 만하므로 사용자가 활동을 다시 시작할 때 언어가 변경됩니다.로캘 변경 : 활동을 강제로 리소스를 다시로드 하시겠습니까?

내 문제에 대한 추악한 해결책은 언어가 변경 될 때마다 각 텍스트 뷰에 새 리소스를로드하는 것입니다. 더 나은 해결책이 있습니까? 아마도 활동을 이산 적으로 다시 시작하는 깔끔한 방법일까요? 리소스를 다시로드 할 필요가 있습니까?

당신의 AndroidManifest.xml에서

답변

18

, 내가 왜 ISN 확실하지 않다

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // refresh your views here 
    super.onConfigurationChanged(newConfig); 
} 

https://developer.android.com/guide/topics/manifest/activity-element.html#config

+0

resource.updateConfiguration()을 호출 할 때이 트리거가 실행 되나요? 필자는 현재 실행하는의 onConfigurationChanged()를 받고 어떤 성공을 가지고 있지. : '( – pgsandstrom

+1

의 onConfigurationChanged() 언어가 변경 될 때 트리거해야 사실 그냥 내가 "나는 내 응용 프로그램에서 언어 설정을"처음 놓친 질문에 붉은 깃발이 당신을 의미 하는가가 찾고.. Android 기기 전반의 언어 설정 기능을 사용하고 있지 않습니까? –

+1

무슨 뜻인지 확실하지 않아? 하지만 앱을 처음 시작할 때 휴대 전화의 로케일을 사용하고 예제 값 -en, 값 -fr, 값 -de 등으로 표시된 여러 리소스가 있습니다. 사용자가 내 앱을 가질 수 있기를 원합니다. 다른 언어로 누른 다음 전화. 이유는 모르지만 일부 사용자는이 기능을 요청했습니다. – pgsandstrom

0

활동 재정에서 활동

android:configChanges="locale" 

이 속성을 추가 에 의해 픽업되었습니다.

이봐, sandis, 당신은 언어를 변경할 때 활동에 호출되지 않습니다 방법을 의미합니까? 나는 똑같은 문제를 만났다. 이 문제는 어쩌면 다음과 같습니다. 언어를 변경하면 활동이 onDestroy() (시도 할 수 있음)이므로 을 호출 할 사람이 없습니다. 활동을 다시 시작하면 이 아닌 onCreate()이 호출됩니다. 로케일 변경과 오리엔테이션 변경에서 다른 무언가가있을 수 있습니다.

+1

정말 죄송합니다. 내 실수입니다. 내 활동은 tabactivity의 내장 된 활동입니다. tabactivity에 android : configChanges = "locale"을 추가하면 언어가 변경 될 때 onDestroy()로 이동하지 않고 잘 작동합니다. tabactivity에서 onConfigurationChanged()를 호출하지만이 메서드는 포함 된 작업에서 호출 할 수 없습니다. – himalayagiant

8

저는 질문이 응용 프로그램의 런타임에서 언어를 전환하고 UI에 현지화 된 메시지를 표시한다고 생각합니다. android:configChanges="locale"은 응용 프로그램이 실행되는 동안 시스템 로케일이 변경된 경우 (시스템의 로케일이 변경된 경우) 응용 프로그램의 코드에서 로캘을 변경하지 않은 경우 (사용자가 원하는 것 같음) onConfigurationChanged을 호출합니다. 그래서 상쾌하지 않습니다.

: 여기
6

는 (내 활동 사용자가 언어 설정을 변경 한 후 다시 시작됩니다 또는 항상 언어가 이미 설정으로 생성 될 경우) 내 필요에 따라 모든 활동에서 onCreate() 또는 onResume() 동안 사용하는 방법

거기에서 수동으로 뷰를 새로 고치거나이 메서드가 완료된 후 호출되는 onConfigurationChanged()에서 새로 고칩니다.

public static void changeLocale(Activity activity, String language) 
{ 
    final Resources res = activity.getResources(); 
    final Configuration conf = res.getConfiguration(); 
    if (language == null || language.length() == 0) 
    { 
     conf.locale = Locale.getDefault(); 
    } 
    else 
    { 
     final int idx = language.indexOf('-'); 
     if (idx != -1) 
     { 
      final String[] split = language.split("-"); 
      conf.locale = new Locale(split[0], split[1].substring(1)); 
     } 
     else 
     { 
      conf.locale = new Locale(language); 
     } 
    } 

    res.updateConfiguration(conf, null); 
} 
+0

좋은 생각. 모든 활동을위한 한 가지 방법. – SMR

+1

조각에서 이것을 수행하면 어떻게 될까요? 어떻게 로케일 언어를 새로 고 칩니 까? –

+0

완벽한 답변 감사합니다. @ 3c71 –

0
public void settingLocale(Context context, String language) { 

Locale locale; 

Configuration config = new Configuration(); 

if(language.equals(LANGUAGE_ENGLISH)) { 

    locale = new Locale("en"); 

    Locale.setDefault(locale); 

    config.locale = locale; 

}else if(language.equals(LANGUAGE_ARABIC)){ 

    locale = new Locale("hi"); 

    Locale.setDefault(locale); 

    config.locale = locale; 

} 

context.getResources().updateConfiguration(config, null); 

// Here again set the text on view to reflect locale change 

// and it will pick resource from new locale 

tv1.setText(R.string.one); //tv1 is textview in my activity 

} 
-1

당신은 사용자가를 변경 한 경우 무슨 일이 일어날 지, 이는 현재 열려있는 모든 활동에 Activity.recreate()를 호출해야합니다 당신이

private void updateLocale(@NonNull final Context context, 
          @NonNull final Locale newLocale) { 
    final Resources resources = context.getResources(); 
    final DisplayMetrics displayMetrics = resources.getDisplayMetrics(); 
    final Configuration configuration = resources.getConfiguration(); 
    configuration.locale = newLocale; 
    resources.updateConfiguration(configuration, displayMetrics); 
    Locale.setDefault(newLocale); 
} 

같은 것을 통해 언어를 변경하고 가정 시스템 언어로 android:configChanges="locale"에 가입하지 않는 동안

+0

downvotes에 대한 설명은 많이 감사하겠습니다. – Thorbear

관련 문제