我创建了广播组,用户可以在其中选择他们想要的语言,并将应用程序语言更改为所选语言,但我无法使用这些功能(不知道如何!)
我做了什么?
- 我已经创建了
settingsActivity
- 我已添加广播组
- 我编写了
setAppLocale
函数 - 我已设置
onRadioButtonClicked
来更改语言
代码
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 文件中发生两件事:
- 将当前语言广播输入标记为已选择
- 当用户选择另一个单选按钮时进行更改
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>
这就是我关于语言切换的全部内容。
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?
知道为什么这个开关不起作用吗?
最佳答案
注意
You can download source code from github repo
Mark current language radio input as selected
然后您需要将区域设置更改标志/状态保存在 SharedPreferences
示例代码按照以下步骤操作
Create one class name
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();
}
}
Now add below code/ condition in your
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
- 区域设置更改后,您需要重新启动或重新创建 Activity
注意:您应该使用 RadioGroup.OnCheckedChangeListener()
而不是 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
关于java - Android Studio 中的 appLocale 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58108423/