How to change the local language when selected item in menu?

Aws Hakam :

I want to change the language by pressing a button and choosing the language from the menu, But I am facing a problem which is that no change has occurred to the language note: 1-I have 2 string file for (en and ar languages). 2-I have options_menu.xml :

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/ar"
        android:title="عربي"/>
    <item android:id="@+id/en"
        android:title="English"/>
</menu>

3-The Main_page.java contains:

public class main_page extends AppCompatActivity  {
private TextView name_nav;
private AppBarConfiguration mAppBarConfiguration;
private StorageReference mStorageRef;
private String uid;
private ImageView user_img;
private long backPressedTime;
private Toast backToast;
private DrawerLayout drawer;
FirebaseStorage storage;
StorageReference storageReference;
Button menu;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_page);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mStorageRef = FirebaseStorage.getInstance().getReference();
    storage = FirebaseStorage.getInstance();
    storageReference = storage.getReference();
    uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
            R.id.nav_tools, R.id.nav_share, R.id.nav_send)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);
    View header = navigationView.getHeaderView(0);
    name_nav = header.findViewById(R.id.name_nav);
    user_img = header.findViewById(R.id.user_img_nav);
    menu = header.findViewById(R.id.menu);
    TextView logout = navigationView.findViewById(R.id.logout);
    logout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseAuth.getInstance().signOut();
            SharedPreferences.Editor pref = getSharedPreferences("Login", MODE_PRIVATE).edit();
            pref.clear();
            pref.commit();
            Intent intent = new Intent(getApplicationContext(), PhoneLoginActivity.class);
            startActivity(intent);
            finish();
        }
    });
    ToggleButton logou_btnt = navigationView.findViewById(R.id.logout_btn);
    logou_btnt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseAuth.getInstance().signOut();
            SharedPreferences.Editor pref = getSharedPreferences("Login", MODE_PRIVATE).edit();
            pref.clear();
            pref.commit();
            Intent intent = new Intent(getApplicationContext(), PhoneLoginActivity.class);
            startActivity(intent);
            finish();
        }
    });
    loadInformation();
    registerForContextMenu(menu);
    menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            openContextMenu(view);
        }
    });
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.options_menu,menu);

}
@Override
public boolean onContextItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()){
        case R.id.ar:
            setLocale("ar");
        case R.id.en:
            setLocale("en");
        default:
            break;
    }
    return super.onContextItemSelected(item);
}
public void setLocale(String lang) {
    Locale myLocale = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
    Intent refresh = new Intent(this, MainActivity.class);
    finish();
    startActivity(refresh);
}
public void loadInformation() {
    FirebaseDatabase.getInstance().getReference().child("Guest").child(uid)
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    System.out.println("fullName" + dataSnapshot.child("img_id").getValue(String.class));
                    name_nav.setText(dataSnapshot.child("fullName").getValue(String.class));
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            });
    StorageReference storageRef = storage.getReference();
    storageRef.child("images/"+uid).getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
        @Override
        public void onSuccess(byte[] bytes) {
            // Use the bytes to display the image
            Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            user_img.setImageBitmap(bmp);
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle any errors
            Toast.makeText(getApplicationContext(), "No Such file or Path found!!", Toast.LENGTH_LONG).show();
        }
    });
}
public void onBackPressed() {
    if (backPressedTime + 2000 > System.currentTimeMillis()) {
        backToast.cancel();
        finishAffinity();
    } else {
        backToast = Toast.makeText(getApplicationContext(), R.string.press_agin, Toast.LENGTH_SHORT);
        backToast.show();
    }
    backPressedTime = System.currentTimeMillis();
}
@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, mAppBarConfiguration)
            || super.onSupportNavigateUp();
}}

The result of run: the MainActivity still refresh without error.

Biscuit :

You might wanna take a look at this change app language progammatically in android

TL;DR:

Kotlin

val config = resources.configuration
val locale = Locale("en")
Locale.setDefault(locale)
config.locale = locale
resources.updateConfiguration(config, resources.displayMetrics)

Android Java

Configuration config = GetBaseContext().getResources().getConfiguration();
Locale locale = new Locale("en");
Locale.setDefault(locale);
config.locale = locale;
GetBaseContext().getResources().updateConfiguration(config, 
GetBaseContext().getResources().getDisplayMetrics());

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=334239&siteId=1