Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Singleton类处理多语言_Java_Android_Singleton_Multilingual - Fatal编程技术网

Java 从Singleton类处理多语言

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

我可以看出,使用objective C可以从Singleton处理多语言。我希望它也可以从Java完成

我想要的是,当用户从微调器中选择语言时,所选语言应设置为当前语言。使用get方法在所有活动中检索当前语言。有可能吗?如果是,如何进行

这就是我到目前为止所做的

我的单身班

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开发者。老兄,你有什么办法解决我吗。