Я новичок ie в Android Studio, и я застрял в проблеме изменения языка. Я надеюсь, что мое приложение позволит нам изменить его язык, нажав кнопку «Сохранить» в диалоговом окне настроек, после того как мы изменим язык на счетчике. Например, если я выберу «Engli sh», язык приложения должен превратиться в Engli sh, хотя язык телефона - это нечто другое. Чтобы сделать это, я искал Inte rnet и импортировал класс LocalHelper, который помог мне изменить язык MainActivity с помощью кнопки. Вот код:
package com.example.evolutionarytree;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button searchButton;
Button lifeTreeButton;
Button settingsButton;
TextView experiment;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleHelper.onAttach(base));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Context context = ElephasMaximus.this;
searchButton = findViewById(R.id.search);
lifeTreeButton = findViewById(R.id.lifeTree);
settingsButton = findViewById(R.id.settings);
experiment = findViewById(R.id.experiment);
searchButton.setOnClickListener(this);
lifeTreeButton.setOnClickListener(this);
settingsButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v == searchButton) {
}
else if (v == lifeTreeButton) {
Intent intent = new Intent(this, ElephasMaximus.class);
startActivity(intent);
}
else if (v == settingsButton) {
SettingDialog settingDialog = new SettingDialog(this);
settingDialog.setDialogListener(new SettingDialog.CustomDialogListener() {
@Override
public void onPositiveClicked(String language) {
//Change Application level locale
LocaleHelper.setLocale(MainActivity.this, language);
//It is required to recreate the activity to reflect the change in UI.
recreate();
experiment.setText(language);
}
@Override
public void onNegativeClicked() {
}
});
settingDialog.show();
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
Window window = settingDialog.getWindow();
int x = (int)(size.x * 0.8f);
int y = (int)(size.y * 0.4f);
window.setLayout(x, y);
}
}
}
Это было MainActivity. Далее следует LocaleHelper:
package com.example.evolutionarytree;
public class LocaleHelper {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context) {
String lang = getPersistedData(context, Locale.getDefault().getLanguage());
return setLocale(context, lang);
}
public static Context onAttach(Context context, String defaultLanguage) {
String lang = getPersistedData(context, defaultLanguage);
return setLocale(context, lang);
}
public static String getLanguage(Context context) {
return getPersistedData(context, Locale.getDefault().getLanguage());
}
public static Context setLocale(Context context, String language) {
persist(context, language);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResources(context, language);
}
return updateResourcesLegacy(context, language);
}
private static String getPersistedData(Context context, String defaultLanguage) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
}
private static void persist(Context context, String language) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SELECTED_LANGUAGE, language);
editor.apply();
}
@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
}
Последний код - это диалоговое окно:
package com.example.evolutionarytree;
public class SettingDialog extends Dialog implements View.OnClickListener {
Button saveButton;
ImageButton closeButton;
Button sendButton;
Context context;
Spinner languageSpinner;
CustomDialogListener customDialogListener;
public SettingDialog(@NonNull Context context) {
super(context);
this.context = context;
}
interface CustomDialogListener{
void onPositiveClicked(String language);
void onNegativeClicked();
}
public void setDialogListener(CustomDialogListener customDialogListener){
this.customDialogListener = customDialogListener;
}
Resources res = getContext().getResources();
String[] languageArray= res.getStringArray(R.array.language);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.setting_dialog);
saveButton = findViewById(R.id.savebutton);
closeButton = findViewById(R.id.closebutton);
sendButton = findViewById(R.id.sendbutton);
languageSpinner = findViewById(R.id.languageSpinner);
ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(getContext(),
R.array.language, android.R.layout.simple_spinner_item);
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
languageSpinner.setAdapter(arrayAdapter);
saveButton.setOnClickListener(this);
closeButton.setOnClickListener(this);
sendButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.savebutton:
if(languageSpinner.getSelectedItem().toString().equals(languageArray[0])) {
String languageString = "ko";
customDialogListener.onPositiveClicked(languageString);
}
else if (languageSpinner.getSelectedItem().toString().equals(languageArray[1])) {
String languageString = "en";
customDialogListener.onPositiveClicked(languageString);
}
dismiss();
break;
case R.id.closebutton:
cancel();
break;
case R.id.sendbutton:
Intent email = new Intent(Intent.ACTION_SEND);
email.setType("plain/Text");
String[] address = {"My Email. HaHaHa"};
email.putExtra(Intent.EXTRA_EMAIL, address);
email.putExtra(Intent.EXTRA_SUBJECT, R.string.bug);
context.startActivity(email);
}
}
}
Теперь проблема в том, что я могу изменить язык MainActivity благодаря LocaleHelper. Но язык другой деятельности не меняется. Как я могу решить эту проблему? Что я хочу, нажав кнопку «Сохранить» в диалоговом окне, весь язык приложения изменится на язык, который я выбрал из счетчика.