英文:
Java Android: Change locale onClick in mainActivity
问题
我想让我的应用支持两种语言,英文和意大利文,所以我在MainActivity中创建了一个切换来改变区域设置。想法是更改区域设置并重新启动活动以传递新的语言。我使用API 28来支持更多设备。
我尝试过这个方法,但它不起作用。有时会更改区域设置,但只能一次。
英文:
I want my app support 2 language, en and it, so I create a Switch to change the locale in the mainActivity.
The idea is to change Locale and restart the activity passing the new language.
I use API 28 to support more devices.
I tried this but it doesn't work.
Sometimes change the locale but only once.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityContext = this.getApplicationContext();
setContentView(R.layout.activity_main);
language = findViewById(R.id.language);
String lan = getIntent().getStringExtra("lan");
if(lan != null) {
if(lan.equals("ita")) {
language.setChecked(true);
lang = "ita";
}else lang = "eng";
}else if(Locale.getDefault().toString().startsWith("it")){
language.setChecked(true);
lang = "ita";
}
buttonPlay.setOnClickListener(view -> enterRoom());
language.setOnCheckedChangeListener((compoundButton, b) -> {
lang = b? "ita" : "eng";
setLocale(lang);
});
}
private void setLocale(String lang){
Locale locale = new Locale(lang.substring(0, 2));
Locale.setDefault(locale);
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
configuration.setLocale(locale);
getApplicationContext().createConfigurationContext(configuration);
Intent i = getIntent();
i.putExtra("lan",lang);
finish();
startActivity(i);
}
答案1
得分: 0
I've translated the code for you, excluding the code parts:
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Switch;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private Switch languageSwitch;
private String lang;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the language preference from the intent or default to the device locale
String lan = getIntent().getStringExtra("lan");
if (lan == null) {
lan = Locale.getDefault().getLanguage();
}
// Set the activity language based on the preference
lang = lan.equals("it") ? "it" : "en";
setLocale(lang);
// Set the activity layout
setContentView(R.layout.activity_main);
// Find views and set up click listeners
languageSwitch = findViewById(R.id.language_switch);
languageSwitch.setChecked(lang.equals("it"));
languageSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
lang = isChecked ? "it" : "en";
setLocale(lang);
});
Button playButton = findViewById(R.id.play_button);
playButton.setOnClickListener(v -> enterRoom());
}
private void setLocale(String lang) {
// Update the app's language configuration
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
configuration.setLocale(locale);
getBaseContext().getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
getApplicationContext().getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
// Restart the activity with the new configuration
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("lan", lang);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
private void enterRoom() {
// Start the room activity with the current language preference
Intent intent = new Intent(this, RoomActivity.class);
intent.putExtra("lan", lang);
startActivity(intent);
}
}
Please note that this is a direct translation of the provided code into Chinese, and I haven't made any changes to the code itself.
英文:
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Switch;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private Switch languageSwitch;
private String lang;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the language preference from the intent or default to the device locale
String lan = getIntent().getStringExtra("lan");
if (lan == null) {
lan = Locale.getDefault().getLanguage();
}
// Set the activity language based on the preference
lang = lan.equals("it") ? "it" : "en";
setLocale(lang);
// Set the activity layout
setContentView(R.layout.activity_main);
// Find views and set up click listeners
languageSwitch = findViewById(R.id.language_switch);
languageSwitch.setChecked(lang.equals("it"));
languageSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
lang = isChecked ? "it" : "en";
setLocale(lang);
});
Button playButton = findViewById(R.id.play_button);
playButton.setOnClickListener(v -> enterRoom());
}
private void setLocale(String lang) {
// Update the app's language configuration
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
configuration.setLocale(locale);
getBaseContext().getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
getApplicationContext().getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
// Restart the activity with the new configuration
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("lan", lang);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
private void enterRoom() {
// Start the room activity with the current language preference
Intent intent = new Intent(this, RoomActivity.class);
intent.putExtra("lan", lang);
startActivity(intent);
}
}
Try this sample code separatly and change it with your code.
答案2
得分: 0
经过数小时的尝试,我最终使用updateConfiguration解决了这个问题,尽管它已被弃用。
private void setLocale(String lang) {
Locale.setDefault(new Locale(lang.substring(0, 2)));
Configuration configuration = new Configuration();
configuration.setLocale(locale);
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
Intent i = getIntent();
i.putExtra("lan", locale);
finish();
startActivity(i);
}
英文:
After hours of trying, I finally fixed this using updateConfiguration even though it's deprecated
private void setLocale(String lang){
Locale.setDefault(new Locale(lang.substring(0, 2)));
Configuration configuration = new Configuration();
configuration.setLocale(locale);
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
Intent i = getIntent();
i.putExtra("lan",locale);
finish();
startActivity(i);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论