Android Studio中的appLocale设置 [英] appLocale setting in android studio
问题描述
我已经建立了无线电组,用户可以在其中选择所需的语言,并将应用程序语言更改为所选语言,但是我无法使用功能(不确定如何操作!)
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!)
- 我已经完成了
settingsActivity
- 我已经添加了广播组
- 我写了
setAppLocale
函数 - 我已将
onRadioButtonClicked
设置为更改语言
- I've made
settingsActivity
- I've added radio group
- I've wrote
setAppLocale
function - I've set
onRadioButtonClicked
to change languages
代码
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>
问题
我需要在Java文件中进行两件事:
Question
I need to make 2 things happen in my java file:
- 将当前的语言单选输入标记为选中状态
- 当用户选择另一个单选按钮时进行更改
问题是如何将
onRadioButtonClicked
连接到setAppLocale
?并按顺序返回当前语言onCreate
显示当前选择的语言?
The question is how do I connect
onRadioButtonClicked
tosetAppLocale
? as well as return current languageonCreate
in order to show current language selected?
更新
根据下面的答案,这是我的最新更新以及添加的其他文件.但是我的语言切换不起作用
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
添加的类
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
添加的类
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:基于答案注释中提供的解决方案,我应该添加
BaseActivity
扩展了我的所有活动,但扩展了我的所有活动是kotlin
而不是java
(settingsActivity除外),我无法添加它.
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:即使没有翻译,是因为我无法添加至少我应该能够看到我的翻译settingsActivity是 java
正确的吗?
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?
推荐答案
注意
将当前的语言单选输入标记为选中
Mark current language radio input as selected
然后,您需要将区域设置更改标记/状态保存在 SharedPreferences
Then you need to save your locale change flag/state inside SharedPreferences
示例代码,请按照以下步骤操作
SAMPLE CODE follow these steps
创建一个类名
PrefManager
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();
}
}
现在在
settingsActivity.java
public class JavaActivity extends AppCompatActivity {
PrefManager prefManager;
RadioButton radio_indo, radio_english;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java);
prefManager = new PrefManager(this);
radio_indo = findViewById(R.id.radio_indo);
radio_english = findViewById(R.id.radio_english);
if (prefManager.getLanguage().equals("en")) {
radio_english.setChecked(true);
} else {
radio_english.setChecked(true);
}
}
}
当用户选择另一个单选按钮时进行更改
Make changes when user select another radio button
- 当用户更改语言时,您需要对其进行更新
SharedPreferences
- 更改区域设置后,您需要重新启动或重新创建活动
注意:您应该使用 RadioGroup.OnCheckedChangeListener()
而不是 android:onClick ="onRadioButtonClicked"
Note : you should use RadioGroup.OnCheckedChangeListener()
instead of android:onClick="onRadioButtonClicked"
示例代码
public class JavaActivity extends AppCompatActivity {
PrefManager prefManager;
RadioButton radio_indo, radio_english;
RadioGroup appLang;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java);
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);
}
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;
}
}
});
}
}
请按照我之前的回答更改区域设置运行时间
Please follow this my previous answer to change locale runtime
https://stackoverflow.com/a/52270630/7666442
这篇关于Android Studio中的appLocale设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!