2017-09-16 1 views
0

Ich wollte eine Option hinzufügen, um die Anwendungssprache mit gemeinsamen Einstellungen zu ändern. Ich habe Sprache wie "en" oder "fa" in den gemeinsamen Einstellungen gespeichert.Wie verwende ich den Kontext-Wrapper, um die App-Sprache in Runtime zu ändern?

Jetzt muss ich freigegebene Einstellungen Daten als Sprache festlegen. Ich habe versucht, This code zu verwenden, aber ich hatte einige Probleme.

Für diesen Code verwenden sollte ich meine Aktivitäten Kontext mit wickeln:

@Override 
protected void attachBaseContext(Context newBase) { 
    super.attachBaseContext(MyContextWrapper.wrap(newBase,languageFromPrefs)); 
} 

ich eine Methode für schrieb von Gemeinschafts-Einstellungen bekommen Sprache getString(Context context,String key,String defaultValue) aufgerufen und bearbeitet dann diesen Code:

@Override 
protected void attachBaseContext(Context newBase) { 
    lang = App.Prefs.getString(newBase, App.Prefs.LANGUAGE_KEY,"fa"); 
    super.attachBaseContext(MyContextWrapper.wrap(newBase,lang)); 
} 

Es scheint gut, aber als ich meine App lief, sah ich eine seltsame Szene. Beim ersten Start war die App-Sprache fa (Persisch) und beim nächsten Mal wurde sie automatisch in en (Englisch) geändert!

[Anmerkung: Gerätesprache ist zur Zeit Englisch]


Hier ist meine MainActivity:

(I kommentierte Codes, die nicht zu meinem Problem in Zusammenhang stehen)

public class MainActivity extends AppCompatActivity { 

    EditText userText; 
    Button embellishBtn; 
    ImageView settings; 
    String lang; 

    @Override 
    protected void attachBaseContext(Context newBase) { 
     lang = App.Prefs.getString(newBase, App.Prefs.LANGUAGE_KEY,"fa"); 
     super.attachBaseContext(App.wrap(newBase,lang)); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
/* 
     userText = (EditText) findViewById(R.id.textBox); 
     embellishBtn = (Button) findViewById(R.id.embellishButton); 
     settings = (ImageView) findViewById(R.id.settings); 

     App.SetFont.EditText(userText,this); 
     App.SetFont.Button(embellishBtn,this); 

     settings.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       Toast.makeText(getBaseContext(),getString(R.string.settings),Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
     }); 

     MarginActivity.isFirstRateMessage = true; 



     Boolean isFirstOpen = App.Prefs.getBoolean(this, App.Prefs.FIRST_OPEN_KEY,true); 

     if (isFirstOpen && TimeZone.getDefault().getDisplayName().toLowerCase().equals("iran standard time")) 
     { 
      App.Prefs.setString(this, App.Prefs.LANGUAGE_KEY,"fa"); 
      App.Prefs.setBoolean(this,App.Prefs.FIRST_OPEN_KEY,false); 
      startActivity(new Intent(this, MainActivity.class)); 
      finish(); 
     } 
     */ 
    } 
/* 
    public void onSettingsClick(View view) 
    { 
     startActivity(new Intent(this, SettingsActivity.class)); 
    } 

    public void onEmbellishClick(View view) 
    { 
     if(userText.getText().toString().trim().length() > 0) 
     { 
      Intent intent = new Intent(this,EmbellishActivity.class); 
      intent.putExtra("user_text",userText.getText().toString() + " "); 

      startActivity(intent); 
     } 
     else 
     { 
      Animation shake = AnimationUtils.loadAnimation(this,R.anim.focus_zoom); 
      userText.startAnimation(shake); 
     } 
     userText.setText(null); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("user_text",userText.getText().toString()); 
    } 
    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     userText.setText(savedInstanceState.getString("user_text")); 
    } 
    */ 
} 

Und getString-Methode (App.Prefs.getString()):

static String getString(Context context,String key,String defaultValue) 
{ 
    SharedPreferences shared = context.getSharedPreferences("Prefs", MODE_PRIVATE); 
    return shared.getString(key, defaultValue); 
} 


läuft Meine Anwendung ohne Fehler. Was sollte ich tun, um dieses Problem zu lösen? Was ist los mit dir?

+0

Bitte folgenden Link überprüfen: https://stackoverflow.com/questions/40221711/android-context-getresources-updateconfiguration-deprecated/40704077#40704077 – nomag

+0

@nomag [LocaleHelper.java] (https: //gist.github. com/muhammad-naderi/0ff264e6cc07df904bc88a9f7efbe57d) ist eigentlich gleich mit [Diesem] (https://stackoverflow.com/questions/40221711/android-context-getresources-updateconfiguration-deprecated/40704077#40704077). –

Antwort

0

Sie haben auf diese Weise für den Wandel

SharedPreferences LanguagePreference = getSharedPreferences("SelectedLanguage", 0); 
    String languageToLoad = LanguagePreference.getString("Language", null); 
    Locale locale =null; 
    if(languageToLoad!=null && languageToLoad.equals("english")) 
     locale =new Locale("en", "US"); 
    else if(languageToLoad!=null && languageToLoad.equals("tamil")) 
     locale =new Locale("ta", "IN"); 
    else 
     locale =new Locale("en", "US"); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.setLocale(locale); 
    getBaseContext().getResources().updateConfiguration(config, 
      getBaseContext().getResources().getDisplayMetrics()); 
+0

Ich kann das nicht verwenden, da 'config.locale' veraltet ist. Dies kann zu Problemen bei hohen APIs führen. –

+0

sehe meinen aktualisierten Beitrag. Sie können 'config.setLocale' anstelle von' config.locale' verwenden – Raja

+0

Auch 'config.setLocale' hat ein Problem. Es benötigt API 17 und höher. Ich brauche eine Methode für API 15 und höher. –

0
@Override 
protected void attachBaseContext(Context newBase) { 
super.attachBaseContext(MyContextWrapper.wrap 
(newBase,languageFromPrefs)); 
} 

in Laufzeit Sprache verwenden Dies sollte in der Basis Aktivität durchgeführt werden, das durch jede Aktivität in Ihrem Projekt erweitert wird.

+0

Ich sagte mit diesem Code, als ich meine App lief, sah ich eine seltsame Szene. Beim ersten Start war die App-Sprache fa (Persisch) und beim nächsten Mal wurde sie automatisch in en (Englisch) geändert! –

Verwandte Themen