I have made radio group where user can select their desire language and app language changes to selected language but i am not able to use the functions (not sure how to!)
What I did?
- I've made
settingsActivity
- I've added radio group
- I've wrote
setAppLocale
function - I've set
onRadioButtonClicked
to change languages
Code
settingsActivity.java
package com.xxxxxx.xxxxx;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.RadioButton;
import java.util.Locale;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
}
}
//locale settings
public void setAppLocale(String localeCode) {
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
conf.setLocale(new Locale(localeCode.toLowerCase()));
} else {
conf.locale = new Locale(localeCode.toLowerCase());
}
res.updateConfiguration(conf, dm);
}
// application language switch
public void onRadioButtonClicked(View view) {
// Is the button now checked?
boolean checked = ((RadioButton) view).isChecked();
// Check which radio button was clicked
switch(view.getId()) {
case R.id.radio_indo:
if (checked)
setAppLocale("id");
break;
case R.id.radio_english:
if (checked)
setAppLocale("en");
break;
}
}
}
settings_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/settings">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="4sp"
android:layout_marginRight="4sp"
android:weightSum="3"
android:gravity="center"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RadioGroup
android:id="@+id/appLang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="35dp"
android:layout_marginEnd="35dp"
android:layout_marginRight="35dp"
android:layout_marginStart="35dp"
android:layout_marginLeft="35dp"
android:orientation="horizontal">
<TextView
android:id="@+id/applangtext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/applangtextstring" />
<RadioButton
android:id="@+id/radio_indo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onRadioButtonClicked"
android:text="@string/indoLang" />
<RadioButton
android:id="@+id/radio_english"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onRadioButtonClicked"
android:text="@string/englishLang" />
</RadioGroup>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
Question
I need to make 2 things happen in my java file:
- Mark current language radio input as selected
- Make changes when user select another radio button
The question is how do I connect
onRadioButtonClicked
tosetAppLocale
? as well as return current languageonCreate
in order to show current language selected?
Update
Based on answer below here is my latest update and extra files that I've added. Yet my language switch doesn't work
settingsActivity.java
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import java.util.Locale;
public class SettingsActivity extends AppCompatActivity {
PrefManager prefManager; //added
RadioButton radio_indo, radio_english; //added
RadioGroup appLang; //added
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
//added
prefManager = new PrefManager(this);
radio_indo = findViewById(R.id.radio_indo);
radio_english = findViewById(R.id.radio_english);
appLang = findViewById(R.id.appLang);
if (prefManager.getLanguage().equals("en")) {
radio_english.setChecked(true);
} else {
radio_english.setChecked(true);
}
// application language switch (added)
appLang.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int checkId) {
switch (checkId) {
case R.id.radio_indo:
prefManager.setLanguage("id");
// you need to restart or recreate your activity after locale change
break;
case R.id.radio_english:
prefManager.setLanguage("en");
// you need to restart or recreate your activity after locale change
break;
}
}
});
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
}
}
//locale settings
public void setAppLocale(String localeCode) {
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
conf.setLocale(new Locale(localeCode.toLowerCase()));
} else {
conf.locale = new Locale(localeCode.toLowerCase());
}
res.updateConfiguration(conf, dm);
}
// removed my old function as new function added to onCreate
}
PrefManager.java
added class
import android.content.Context;
import android.content.SharedPreferences;
public class PrefManager {
private SharedPreferences.Editor editor;
private Context mContext;
private SharedPreferences prefs;
private final String LANGUAGE = "language";
private final String PREF = "user_data";
public PrefManager(Context mContext) {
this.mContext = mContext;
}
public String getLanguage() {
this.prefs = this.mContext.getSharedPreferences(PREF, 0);
return this.prefs.getString(LANGUAGE, "en");
}
public void setLanguage(String language) {
this.editor = this.mContext.getSharedPreferences(PREF, 0).edit();
this.editor.putString(LANGUAGE, language);
this.editor.apply();
}
}
BaseActivity.java
added class
import android.content.Context;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Locale;
/**
* Created by nilesh on 20/3/18.
*/
public class BaseActivity extends AppCompatActivity {
@Override
protected void attachBaseContext(Context newBase) {
Locale newLocale;
String lang = new PrefManager(newBase).getLanguage();
if (lang.equals("en")) {
newLocale = new Locale("en");
} else {
newLocale = new Locale(lang);
}
Context context = ContextWrapper.wrap(newBase, newLocale);
super.attachBaseContext(context);
}
}
settings_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/settings">
<RadioGroup
android:id="@+id/appLang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="35dp"
android:layout_marginLeft="35dp"
android:layout_marginTop="90dp"
android:layout_marginEnd="35dp"
android:layout_marginRight="35dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/applangtext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/applangtextstring" />
<RadioButton
android:id="@+id/radio_indo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/indoLang" />
<RadioButton
android:id="@+id/radio_english"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/englishLang" />
</RadioGroup>
</RelativeLayout>
This is all I have regarding to language switch.
PS-1: based on provided solution in answer comments I should have add
BaseActivity
as extends in all my activites but as all my activities arekotlin
notjava
(except settingsActivity) I was not able to add it.PS-2: even if not getting translatations is because I couldn't add extends at very least I should be able to see translations in my settingsActivity which is
java
right?
Any idea why this switch doesn't work?