2016-10-20 4 views
2

У меня есть метод, который запускается из меню настроек, чтобы выбрать разные языки. Я хочу сохранить это в файле SharedPreferences, но я постоянно получаю ошибки без объяснения причин. Если я нажму «ОК», приложение продолжит нормально, но оно не сохранит выбранные языки.Сохранение общих настроек из настроек

Метод:

static String langSet = ""; 
static SharedPreferences languageSettings; 
static SharedPreferences.Editor editLang; 


    public static void updateResources(Context context, String language) { 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 

     Resources resources = context.getResources(); 

     Configuration configuration = resources.getConfiguration(); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      configuration.setLocale(locale); 
     } else { 
      configuration.locale = locale; 
     } 

     resources.updateConfiguration(configuration, resources.getDisplayMetrics()); 
    } 

OnCreate:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //LocaleHelper.onCreate(this, "es"); 

     languageSettings = getSharedPreferences("languages", Context.MODE_PRIVATE); 
     editLang = languageSettings.edit(); 


     if (langSet != ""){ 

      langSet = languageSettings.getString("lang", ""); 
      updateResources(this, langSet); 

     } 
startButton = (Button) findViewById(R.id.startButton); 

     startButton.setOnClickListener(new AdapterView.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent intent = new Intent(getApplicationContext(), Main2Activity.class); 
       //intent.putExtra("name", friends.get(i)); 
       startActivity(intent); 

      } 
     }); 
} 

onCreateOptionsMenu:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_main, menu); 

     return true; 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 

     if (id == R.id.english) { // IMPORT THE MENU.XML FOLDER 

      languageSettings = getSharedPreferences("languages", Context.MODE_PRIVATE); 
      editLang.putString("lang", "en"); 
      editLang.apply(); 
      langSet = languageSettings.getString("lang", ""); 

      updateResources(this, langSet); 
      Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
      //intent.putExtra("name", friends.get(i)); 
      startActivity(intent); 


     } 
     else if (id == R.id.afrikaans) { 

      languageSettings = getSharedPreferences("languages", Context.MODE_PRIVATE); 
      editLang.putString("lang", "af"); 
      editLang.apply(); 
      langSet = languageSettings.getString("lang", ""); 

      updateResources(this, langSet); 
      Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
      //intent.putExtra("name", friends.get(i)); 
      startActivity(intent); 

     } 
     else if (id == R.id.spanish) { 

      languageSettings = getSharedPreferences("languages", Context.MODE_PRIVATE); 
      editLang.putString("lang", "es"); 
      editLang.apply(); 
      langSet = languageSettings.getString("lang", ""); 

      updateResources(this, langSet); 
      Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
      //intent.putExtra("name", friends.get(i)); 
      startActivity(intent); 

     } 

     return super.onOptionsItemSelected(item); 
    } 

Пожалуйста помогите. Thanks

+0

Опубликовать журнал ошибок. – fluffyBatman

+1

Кстати, не сравнивайте строки с == or =! operator.Используйте метод .equals(): if (langSet! = "") должен быть, если (! langSet.equals ("")) –

ответ

2

Несколько лет назад это случилось со мной. Ошибка была, когда я изменил sharedPreferenceType.

Например, если вы меняете editLang.putString("lang", "en"); на editLang.putInt("lang", 1); и просто установите приложение, оно не будет работать, потому что вы использовали тот же ключ для другого типа значения.

Чтобы решить мою проблему, перед установкой необходимо было вручную удалить все приложение с устройства.

Итак, мое предложение попробовать либо удалить приложение или перейти к деталям приложения в андроид устройства и очистить данные приложения до этого рода изменений. Конечно, позаботьтесь о том, когда приложение будет в производстве, я бы рекомендовал изменить имя ключа, если вы хотите изменить тип значения.

+2

Полная деинсталляция не нужна. Достаточно было бы получить настройки -> приложения, а затем очистить данные приложения. –

+0

@MarcinOrlowski спасибо. Починил это. – Paulo

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