0

Я делаю многоязычный проект андроида. Я сделал это, но когда я закрыл приложение, он вернулся к языку по умолчанию. Я искал поисковые запросы и искал некоторые темы в stackoverflow. Говорят, мне нужно сохранить текущий язык с SharedPreferences. Я попробовал, но это не сработало. PLZ проверить, что я делаю неправильно. Мой код:Как сохранить текущий язык на нескольких языках?

public class setting extends Fragment { 

/** 
* @param args 
*/ 
private Spinner spinnerctrl; 
private Locale myLocale; 
public View onCreateView(LayoutInflater inflater, 
     @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View settingView = inflater.inflate(R.layout.setting, container, false); 
    spinnerctrl = (Spinner) settingView.findViewById(R.id.spinner1); 
    spinnerctrl.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      if (arg2 == 1) { 
       Toast.makeText(arg0.getContext(), "You have selected English", Toast.LENGTH_SHORT).show(); 
       setLocale("en"); 
      } else if (arg2 == 2) { 
       Toast.makeText(arg0.getContext(), "You have selected VietNam", Toast.LENGTH_SHORT).show(); 
       setLocale("vi"); 
      } 
     } 

     private void setLocale(String lang) { 
      // TODO Auto-generated method stub 
      SharedPreferences prefs = getActivity().getSharedPreferences(
         "com.example.app", Context.MODE_PRIVATE); 
      myLocale = new Locale(lang); 
      Resources res = getResources(); 
      DisplayMetrics dm = res.getDisplayMetrics(); 
      Configuration conf = res.getConfiguration(); 
      conf.locale = myLocale; 
      res.updateConfiguration(conf, dm); 
      Intent refresh = new Intent(getActivity(), MainActivity.class); 
      startActivity(refresh); 
      String lan = prefs.getString("language", Locale.getDefault().getLanguage()); 
      setLocale(lan); 
      prefs.edit().putString("language", "en").apply(); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      // TODO Auto-generated method stub 

     } 

    }); 
    return settingView; 
} 

ответ

0

В вашем setLocale(), сначала вы должны хранить предпочтения, а затем получить его. Вы делаете это обратным образом. Так,

prefs.edit().putString("language", "en").apply(); 

должен прийти первым, а затем

String lan = prefs.getString("language", Locale.getDefault().getLanguage()); 

Обновлено функция:

private void setLocale(String lang) { 
    /*SharedPreferences prefs = getActivity().getSharedPreferences(
       "com.example.app", Context.MODE_PRIVATE);*/ 

    SharedPreferences setPrefs = getApplicationContext().getSharedPreferences("com.example.app", MODE_PRIVATE); 
    SharedPreferences.Editor editor = setPrefs.edit(); 
    editor.putString("language", "en"); 
    editor.commit(); 

    myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(getActivity(), MainActivity.class); 
    startActivity(refresh); 

    /*prefs.edit().putString("language", "en").apply(); 
    String lan = prefs.getString("language", Locale.getDefault().getLanguage()); 
    //setLocale(lan); //Remove this. It will create infinite loop */ 

    SharedPreferences getPrefs = getApplicationContext().getSharedPreferences("com.example.app", MODE_PRIVATE); 
    String lan = getPrefs.getString("language", ""); 
    System.out.println("-- locale from getPrefs " + lan); 

} 

Чтобы узнать больше о SharedPreferences проверки этого link.

+0

Это означает, что мне нужно поставить prefs.edit(). PutString ("language", "en"). Apply(); сначала String lan = prefs.getString ("language", Locale.getDefault(). getLanguage()); По-прежнему не работает @@ извините, я не очень хорош в SharedPreferences – user3513645

+0

Замените 'setLocale()' и ответьте. – Paritosh

+0

удалить setLocale (lan)? – user3513645

Смежные вопросы