Java 从Singleton类处理多语言
我可以看出,使用objective C可以从Singleton处理多语言。我希望它也可以从Java完成 我想要的是,当用户从微调器中选择语言时,所选语言应设置为当前语言。使用get方法在所有活动中检索当前语言。有可能吗?如果是,如何进行 这就是我到目前为止所做的 我的单身班Java 从Singleton类处理多语言,java,android,singleton,multilingual,Java,Android,Singleton,Multilingual,我可以看出,使用objective C可以从Singleton处理多语言。我希望它也可以从Java完成 我想要的是,当用户从微调器中选择语言时,所选语言应设置为当前语言。使用get方法在所有活动中检索当前语言。有可能吗?如果是,如何进行 这就是我到目前为止所做的 我的单身班 public class SharedMemory { private String currentLanguage; private static SharedMemory instance; private Sha
public class SharedMemory {
private String currentLanguage;
private static SharedMemory instance;
private SharedMemory() {
}
public static SharedMemory getInstance() {
if (instance == null)
instance = new SharedMemory();
return instance;
}
public String getCurrentLanguage() {
return currentLanguage;
}
public void setCurrentLanguage(String currentLanguage) {
this.currentLanguage = currentLanguage;
}
我的基本活动课
public class Base_Activity extends Activity {
private String currentLanguage;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
final Spinner spinner = (Spinner) menu.getItem(0).getActionView()
.findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.languages, R.layout.spinner_row);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
currentLanguage = spinner.getSelectedItem().toString();
Log.i("Seted Language", currentLanguage);
switch (arg2) {
case 0:
// do nothing
break;
case 1:
setLocale("en_US");
break;
case 2:
setLocale("fi");
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// Locale.setDefault(Locale.ENGLISH);
}
});
return super.onCreateOptionsMenu(menu);
}
public void setLocale(String currentLanguage) {
Locale myLocale = new Locale(currentLanguage);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
recreate();
SharedMemory.getInstance().setCurrentLanguage(currentLanguage);
}
}
公共类基类活动扩展活动{
私有字符串语言;
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.main,menu);
最终微调器微调器=(微调器)菜单。getItem(0)。getActionView()
.findviewbyd(R.id.spinner);
ArrayAdapter=ArrayAdapter.createFromResource(
这,R.array.languages,R.layout.spinner_row);
旋转器。设置适配器(适配器);
spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
currentLanguage=spinner.getSelectedItem().toString();
Log.i(“设置语言”,currentLanguage);
开关(arg2){
案例0:
//无所事事
打破
案例1:
setLocale(“en_US”);
打破
案例2:
setLocale(“fi”);
打破
}
}
@凌驾
未选择公共无效(AdapterView arg0){
//setDefault(Locale.ENGLISH);
}
});
返回super.onCreateOptions菜单(菜单);
}
公共void setLocale(字符串currentLanguage){
Locale myLocale=新的语言环境(currentLanguage);
Resources res=getResources();
DisplayMetrics dm=res.getDisplayMetrics();
Configuration=res.getConfiguration();
conf.locale=myLocale;
res.updateConfiguration(conf,dm);
重新创建();
SharedMemory.getInstance().setCurrentLanguage(currentLanguage);
}
}
但是在这里,语言从我不想要的区域设置更改了。我使用SharedReferences执行此操作:
String firstLocale = getResources().getConfiguration().locale.toString().substring(0, 2);
String currentLocale = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", firstLocale);
Locale locale = new Locale((String) currentLocale);
Configuration config = new Configuration();
config.locale = locale;
Locale.setDefault(locale);
它在我的应用程序中运行良好。伙计。我的代码有什么问题。当我使用SharedMemory.getInstance.getCurrentLanguage调用活动时。说NullPointerException时会崩溃。我不知道getCurrentTraining是什么,但由于您正在取消getInstance()操作,我猜您调用getCurrentTraining()时没有首先正确初始化训练变量。对不起。我编辑了我的评论。事实上,我正试图写currentLanguage。你到底得到了哪一行的nullpointerexception。请发布您的日志。不,我是在活动类中使用Log.I进行检查的,该类具有此基本活动类的扩展。因此,基本上,您希望在代码中更改您的语言,而不依赖于用户的区域设置?没错。这可能吗?@Android开发者。老兄,你有什么办法解决我吗。