2010-02-24 5 views
16

Ich versuche, das Gebietsschema in meiner App zu einem vom Benutzer angegebenen zu erzwingen. Da dies für Demonstrationen verwendet werden kann, möchte ich die Sprache/das Gebietsschema in der App ändern und nicht für das gesamte Gerät.Android - Erzwungenes Gebietsschema bei Richtungsänderungen zurückgesetzt

Ich schaute mich SO an und versuchte jeden Hinweis zu benutzen, den ich hier fand. Das Ergebnis: Ich kann meine Testaktivität mit der neuen Sprache neu starten, aber wenn ich die Ausrichtung ändere, wird das Gebietsschema immer auf das Gerät zurückgesetzt.

I uploaded a minimalistic project so können Sie mein Problem reproduzieren. Bitte ignorieren Sie die Schrumpfung der Benutzeroberfläche, es ist nicht wichtig :)

Antwort

2

Ist das Zurücksetzen des Gebietsschemas aufgetreten, weil Ihre Aktivität bei Orientierungsänderung neu gestartet wird?

Wenn ja, können Sie abfangen oder verhindern Orientierung ändert: Activity restart on rotation Android

+0

I „neu starten“ meine Tätigkeit mit finish() und startActivity(), um das Neuladen der Benutzeroberfläche zu erzwingen, die das neue Gebietsschema verwenden.Die Orientierungsänderung setzt immer mein Gebietsschema zurück – WarrenFaith

3

ich Ihren Code nur sah.

Überprüfen Sie, ob der von Ihnen verwendete Locale von java.util stammt und nicht von android. Ihr Code wird das Gebietsschema des Mobiltelefons nicht ändern.

es testen:

  • ich mein Telefon auf Spanisch.
  • Öffnen Sie Ihre App
  • klicken Sie auf die Schaltfläche
  • nach Hause gehen
  • Icons statt Englisch in Spanisch waren.

Wenn das, was Sie versuchen, genau das zu tun wird, um die Locale auf eine Standardeinstellung und in der Lage, den gleichen Wert nach einer Drehung des Bildschirms zu sehen:

Statt:

android:configChanges="locale" 

Verwendung:

android:configChanges="locale|orientation" 
9

Dieses Code-Snippet tut, was Sie brauchen, ich habe es getestet. Angenommen, Sie möchten, dass der Benutzer die Sprache durch ein Menü Ihrer Hauptaktivität wechseln kann. Sie können es durch die Sprache Flagge als Benutzereinstellung speichern und überprüfen Sie es auf „onCreate()“ und auf „onConfigurationChanged()“ wie folgt:

public class MainActivity extends Activity { 

SharedPreferences mPrefs1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.activity_main); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 
    setContentView(R.layout.activity_main); 
} 

// Declaring the Menu options 
@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{  
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu, menu); 
    return true; 
} 

//handle menu item selection 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) { 
    case R.id.menu_switch_language: 
     String languageToLoad = getResources().getString(R.string.switch_language); 

     mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = mPrefs1.edit(); 
     editor.putString("languagePref", languageToLoad); 
     editor.commit(); // Very important to save the preference      
     finish(); 
     startActivity(getIntent()); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

}

2

Sie sollten Ihre locale zwingen Anwendung :: onCreate und Anwendung :: onConfigurationChanged. Vergessen Sie nicht, Ihre Anwendungsklasse in AndroidManifest.xml

3

Was für mich gearbeitet registrieren den Lokalisierungs-Einstellungen rechts, bevor Sie Ihre Layouts aufblasen:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    String userLocale = "Wolof"; // adapt to your need 
    Locale locale = new Locale(userLocale); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.my_activity); 

    ... 

}