2017-03-01 4 views
3

내가 사용하는 코드를 다음과 같은 다중 언어 Englsih에 대한 응용 프로그램 및 힌디어안드로이드 로케일과 updateConfiguration이

을 만드는 오전과는 완벽하게 작동되지 않습니다,하지만 몇 가지가 그것에서 사용되지 않습니다, 단지 그것을 해결하는 방법을 말해

되지 않는 코드는

conf.locale = myLocale; 
res.updateConfiguration(conf, dm); 

내 전체 코드입니다 :

private Intent intent; 
    private Locale myLocale; 
    private Resources res; 
    private DisplayMetrics dm; 
    private Configuration conf; 

switch(lang) 
        { 
         case "no_lang": 

          editor = preferences.edit(); 
          editor.putString("set_language","en"); 
          editor.commit(); 

          myLocale = new Locale("en"); 
          res = getResources(); 
          dm = res.getDisplayMetrics(); 
          conf = res.getConfiguration(); 
          conf.locale = myLocale; 
          res.updateConfiguration(conf, dm); 
          intent = new Intent(SplashActivity.this, MainActivity.class); 
          startActivity(intent); 
          finish(); 
          break; 
         case "en": 

          editor = preferences.edit(); 
          editor.putString("set_language","en"); 
          editor.commit(); 

          myLocale = new Locale("en"); 
          res = getResources(); 
          dm = res.getDisplayMetrics(); 
          conf = res.getConfiguration(); 
          conf.locale = myLocale; 
          res.updateConfiguration(conf, dm); 
          intent = new Intent(SplashActivity.this, MainActivity.class); 
          startActivity(intent); 
          finish(); 
          break; 
         case "hi": 
          editor = preferences.edit(); 
          editor.putString("set_language","hi"); 
          editor.commit(); 

          myLocale = new Locale("hi"); 
          res = getResources(); 
          dm = res.getDisplayMetrics(); 
          conf = res.getConfiguration(); 
          conf.locale = myLocale; 
          res.updateConfiguration(conf, dm); 
          intent = new Intent(SplashActivity.this, MainActivity.class); 
          startActivity(intent); 
          finish(); 
          break; 
        } 
(이 난 그냥 당신에게 주요 부분을 표시하고 전체 코드가 아닙니다)

내가이 링크를 따라하지만 난 그것을 받고 있지 않다 ... link1, link2

답변

1

확인 내가 @Bassel Mourjan

내가 하나 개의 기본 활동을하고의 this answer 사용하여 해결 남은 조각은, 아래 코드는 입니다. (이 코드는 android 7.1.1 (genymotion emu)에서 테스트했으며 작동합니다)

위의 링크에서 MyContextWrapper 클래스를 참조하십시오. MainActivity

, 영어, 힌디어 마라타어 : 버튼 내 MainActivity에서

나는 사용자 예 : 선택한 언어를 얻고 그 활동에서 결과를 활동을 개방하고 클릭

다음
 // i use shared preference to save my language so that when user close 
     //app and open it, then his previous language will be set 
      @Override 
      public void attachBaseContext(Context newBase) 
      { 
       SharedPreferences preferences1 = newBase.getSharedPreferences("global",newBase.MODE_PRIVATE); 
       String lang=preferences1.getString("set_language","en"); // at start no language selected so default is english 
       super.attachBaseContext(MyContextWrapper.wrap(newBase,lang)); 
      } 



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

      navigation_header_language.setOnClickListener(this);//Language button 
    } 

     @Override 
     public void onClick(View v) 
     { 

      switch (v.getId()) 
      { 
       case R.id.navigation_header_language: 

        Intent i = new Intent(this, LanguageActivity.class); 
        startActivityForResult(i, 101); 

        break; 
      } 
     } 

// when user selects language i store it in shared preference and set result 
// as RESULT_OK and here in onActivityResult's result_ok i simply recreate activity 
//so that attachBaseContext called again and language set as we want 
     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      if (requestCode == 101) { 
       if(resultCode == Activity.RESULT_OK) 
       { 
        this.recreate(); 
       } 

       if (resultCode == Activity.RESULT_CANCELED) { 
        //Write your code if there's no result 
       } 
      } 
     } 

이 LanguageActivity 인 결과에 대한 주요 활동에서 전화하고 있습니다

 public class LanguageActivity extends AppCompatActivity 
     { 
      private CardView english_language,hindi_language,marathi_language; 
      private SharedPreferences preferences; 
      private SharedPreferences.Editor editor; 

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

       english_language=(CardView)findViewById(R.id.english_language); 
       hindi_language=(CardView)findViewById(R.id.hindi_language); 
       marathi_language=(CardView)findViewById(R.id.marathi_language); 

       preferences =getSharedPreferences("global",MODE_PRIVATE); 

       english_language.setOnClickListener(new View.OnClickListener() 
       { 
        @Override 
        public void onClick(View v) 
        { 
         editor = preferences.edit(); 
         editor.putString("set_language","en"); 
         editor.commit(); 
         setResultCode(); 
        } 
       }); 

       hindi_language.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) 
        { 
         editor = preferences.edit(); 
         editor.putString("set_language","hi"); 
         editor.commit(); 
         setResultCode(); 
        } 
       }); 

       marathi_language.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) 
        { 
         editor = preferences.edit(); 
         editor.putString("set_language","mr"); 
         editor.commit(); 
         setResultCode(); 
        } 
       }); 
      } 

      private void setResultCode() 
      { 
       Intent returnIntent = new Intent(); 
       setResult(Activity.RESULT_OK,returnIntent); 
       finish(); 
// when this activity close, onActivityResult method call from Mainactivity 
//and there i used this.recreate() which will recreate mMainactivity an 
//attachBaseContext will be called once again 
      } 
     }