2017-03-15 10 views
0

다른 언어로 번역 된 앱이 있습니다. 이를 위해 locale을 사용했고 사용자가 선호하는 언어를 저장하기 위해 나는 SharedPreferences을 사용했습니다.`onResume` 메소드 이후 로케일 변경이 작동하지 않습니까?

이것을 사용하여 앱 내/모든 활동에서 선호 언어를로드 할 수있었습니다.

 @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pick); 

    findViewById(R.id.flagcollection).setVisibility(View.GONE); 

    findViewById(R.id.worldmapswitch) 
      .setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if (flagWorld) { 
         // means true 
         findViewById(R.id.flagcollection).setVisibility(View.GONE); 
         flagWorld = false; 
        } else { 
         findViewById(R.id.flagcollection).setVisibility(View.VISIBLE); 
         flagWorld = true; 
        } 
       } 
      }); 

    preferences = getSharedPreferences("settings_values", MODE_PRIVATE); 

    String SavedLocaleLang = preferences.getString("LocalLang", null); 
    Locale locale = new Locale(SavedLocaleLang); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 
.... 

문제는 어떤 이유로 내가 응용 프로그램을 떠나면 내가 응용 프로그램에 돌아올 때 잠시 후, (활동 종료/종료하지 않음) 즉, 휴대 전화의 기본 언어가 아닌 저장된 값을 사용하여 실행 장소.

그런 다음 내 자바와 결합 onResume의 기적에 관한 수많은 글을 읽은 후 더-능력이 시도하지 :

@Override 
public void onResume(){ 
    super.onResume(); 
    // put your code here... 

    preferences = getSharedPreferences("settings_values", MODE_PRIVATE); 

    String SavedLocaleLang = preferences.getString("LocalLang", null); 
    Locale locale = new Locale(SavedLocaleLang); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 


} 
나는 내 문제를 해결 한 것으로 생각

, 미만에 결과를 테스트 후 1 시간 이상 나는 아무것도하지 않았다는 것을 깨달았다. 어딘가 잘못하고 있어요.

기술, 인내, 그리고 많은 의지가있는 사람이 있다면, 내가 뭘 잘못하고 있는지 이해하도록 도와주세요.

도움이 될 것입니다. 그래도 풍자는 없어. 나는 잘하고있다 : P

감사합니다 !!!

P.

findViewById(R.id.flaghungary) 
      .setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        String localeHU = "hu"; 
        SharedPreferences settings = getSharedPreferences("settings_values", MODE_PRIVATE); 
        SharedPreferences.Editor editor = settings.edit(); 
        editor.putString("LocalLang", localeHU); 
        editor.apply(); 

        Locale locale = new Locale("hu"); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 
        setContentView(R.layout.activity_pick); 
        Context context = getApplicationContext(); 
        Toast.makeText(context, "Magyar nyelv kiválasztva", Toast.LENGTH_SHORT).show(); 
        recreate(); 
       } 


      }); 
+0

대부분의 경우, 프로세스를 사용자 "Cochi은"그래서 여기 당신이 가서 ... Prefereces의 로케일을 저장하기위한 코드를 요청 앱이 백그라운드에있는 동안 종료되었습니다. [이것은 완벽하게 정상입니다.] (https://developer.android.com/guide/components/processes-and-threads.html#Lifecycle). 그 외에도 "내가 잘못한 일을하는 곳"이라는 뜻을 설명하십시오. – CommonsWare

+0

로캘을 저장할 때'SharedPreferences.Editor' 객체에서'commit()'또는'apply()'를 호출하고 싶습니다. 일반적인 감시이며 sharedPreferences는 업데이트하지 않으면 업데이트되지 않습니다. – DeeV

+0

안녕하세요. 빠른 답장을 보내 주셔서 감사합니다. 이전처럼 onCreate에서 코드를 업데이트했습니다. 이제 Nika Kurdadze의 솔루션을 시도하고 있습니다. 어쩌면 작동 할 수 있습니다 : D – Robert

답변

1

onCreate 안에 그 코드를 넣어 시도는 setContentView 전에 :

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    String SavedLocaleLang = preferences.getString("LocalLang", null); 
    Locale locale = new Locale(SavedLocaleLang); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 
+0

안녕하세요. 고맙습니다. 그러나 더 큰 그림을 가질 수 있도록 onCreate 메서드에서 더 많이 복사해야합니다. 나는 그것을했다. 이제 나는 너의 방식으로 그것을 시도 할 것이다 :). 제안 해 주셔서 감사합니다. 작동 여부를 확인하기까지는 다소 시간이 걸리지 만 회신을 남겨 두어야합니다. 다시 고마워. – Robert

+0

안녕하세요. 그것은 당신의 솔루션이 작동하는 것 같습니다. 또는 적어도 나는 그것이 좋기를 바란다. 나는 하루 종일 앱을 테스트했는데 결함이 발견되지 않았다. 아직 :). 그래서 ... 고마워! – Robert

+0

이 문제가 해결되어 기쁩니다. –