3

i am creating multi language app for Englsih and hindi

following code i used and its working perfectly, but some things are deprecated from it, just tell me how to solve it ,

deprecated code is

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

my whole code :(this is not full code i am just showing you main part)

 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;
                    }

i follow these link but i am not getting it... link1, link2

Community
  • 1
  • 1
dharmx
  • 694
  • 1
  • 13
  • 20

1 Answers1

1

ok i solved it by using this answer of @Bassel Mourjan

i have one base activity and remaining are fragments, below is my code (i tested this code in android 7.1.1 (genymotion emu) and it works)

see (use) MyContextWrapper class from above link.

in my MainActivity on button click i am opening activity for result from that activity i am getting language selected by user e.g : english,hindi,marathi

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
                }
            }
        }

Here is LanguageActivity which is i am calling from Main activity for result

      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
            }
        }
dharmx
  • 694
  • 1
  • 13
  • 20