0

I am creating a simple app that needs to change the language on clicking the image view which is present in the toolbar. The app actually comes with tab-layout inside the navigation drawer. I am using another language (locale) for my own mother-tongue (Tamil).

If the user clicks the imageView in the toolbar, the app's language should change from English to Tamil. but when I click on the imageView, the app's language is not changing., since I had already created another locale in the string file., I don't know why the language is not changing.

MainActivity.java:

public class MainActivity extends AppCompatActivity

        implements NavigationView.OnNavigationItemSelectedListener {



    ImageView imageView;
    Context context;
@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        context = this;

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);


        setSupportActionBar(toolbar);
        imageView = (ImageView)findViewById(R.id.imageView);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String languageToLoad  = "ta_IN";
                Locale locale = new Locale(languageToLoad);
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.locale = locale;
                getBaseContext().getResources().updateConfiguration(config,context.getResources().getDisplayMetrics());

                Toast.makeText(getApplicationContext(),"Language changed",Toast.LENGTH_LONG).show();
                Intent intent = new Intent(MainActivity.this,MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//it will recreate it self with new language.
                startActivity(intent);

            }
        });






        TabLayout tabLayout =(TabLayout)findViewById(R.id.tabs);

        ViewPager Pager =(ViewPager)findViewById(R.id.viewpager);



        tabpagerAdapter Tabpageradapter = new tabpagerAdapter(getSupportFragmentManager());

        Pager.setAdapter(Tabpageradapter);

        tabLayout.setupWithViewPager(Pager);



        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(

                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        drawer.setDrawerListener(toggle);

        toggle.syncState();



        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

        navigationView.setNavigationItemSelectedListener(this);

    }







    @Override

    public void onBackPressed() {

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        if (drawer.isDrawerOpen(GravityCompat.START)) {

            drawer.closeDrawer(GravityCompat.START);

        } else {

            super.onBackPressed();

        }

    }



    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }



    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle action bar item clicks here. The action bar will

        // automatically handle clicks on the Home/Up button, so long

        // as you specify a parent activity in AndroidManifest.xml.

        int id = item.getItemId();



        //noinspection SimplifiableIfStatement

        if (id == R.id.action_settings) {

            return true;

        }



        return super.onOptionsItemSelected(item);

    }



    @SuppressWarnings("StatementWithEmptyBody")

    @Override

    public boolean onNavigationItemSelected(MenuItem item) {

        // Handle navigation view item clicks here.

        int id = item.getItemId();



        if (id == R.id.nav_camera) {

            // Handle the camera action

        } else if (id == R.id.nav_gallery) {



        } else if (id == R.id.nav_slideshow) {



        } else if (id == R.id.nav_manage) {



        } else if (id == R.id.nav_share) {



        } else if (id == R.id.nav_send) {



        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        drawer.closeDrawer(GravityCompat.START);

        return true;

    }

}

:Here I've attached the screenshot for my locale file structure

halfer
  • 19,824
  • 17
  • 99
  • 186
Thedroider
  • 229
  • 1
  • 5
  • 18

3 Answers3

1

After applying locale changes try calling activity.recreate(). This will allow activity to be recreated with new instance. you can check the documentation here

Replace your code for startactivity() with recreate()

karan
  • 8,637
  • 3
  • 41
  • 78
  • ..., should I need to remove intent –  Thedroider Jan 28 '19 at 06:51
  • ., The activity is re-creating , but the language is not changing –  Thedroider Jan 28 '19 at 07:00
  • This is what I tried: imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String languageToLoad = "ta_IN"; Locale locale = new Locale(languageToLoad); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; getBaseContext().getResources().updateConfiguration(config,context.getResources().getDisplayMetrics()); recreate(); } }) –  Thedroider Jan 28 '19 at 07:01
  • @Thedroider on what android version are you testing? – karan Jan 28 '19 at 07:13
  • @KaranMer In android version 9.0 in my OnePlus 6 –  Thedroider Jan 28 '19 at 07:15
  • try using `getApplicationContext()` in updateConfiguration – karan Jan 28 '19 at 07:21
  • ., should I use something like this?: config.locale = locale; getApplicationContext().getResources().updateConfiguration(config,context.getResources().getDisplayMetrics()); –  Thedroider Jan 28 '19 at 07:27
  • .., Ahh ok... will let you know once I tested it –  Thedroider Jan 28 '19 at 07:34
  • check the updated answer from here https://stackoverflow.com/questions/40221711/android-context-getresources-updateconfiguration-deprecated – karan Jan 28 '19 at 08:08
-1

To explore more about the recreate() method of activity please check the given link below:- How to call recreate()?

DeePanShu
  • 1,236
  • 10
  • 23
  • ok, please try setting language explicitly using other answers and then try to save the current language selected in shared preference and when you start the activity then check which language is selected and according to that selection try your requirments – DeePanShu Jan 28 '19 at 07:10
-1

Add the recreate method as i mentioned here in your code

   String languageToLoad  = "ta_IN";
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration config = new Configuration();
                    config.locale = locale;
                    getBaseContext().getResources().updateConfiguration(config,context.getResources().getDisplayMetrics());
        recreate();
Praveen
  • 93
  • 1
  • 7