2012-11-01 18 views
10

Wir haben eine Android-App, die als Client für ein Remote-PC-Programm fungiert. Wir möchten eine Funktion hinzufügen, damit der PC die Android-App anweist, ihr Gebietsschema zur Laufzeit zu ändern, d. H. Die App zu starten; stelle es in Kommunikation mit dem PC; Irgendwann später sagt der PC der App, dass sie zum Beispiel auf Spanisch oder Chinesisch wechseln soll.Ändern Sie das Gebietsschema zur Laufzeit?

Wir haben bereits alle Layout- und String-Ressourcen für ihre jeweiligen Ländereinstellungen eingerichtet. Unsere App ist die einzige App, die der Nutzer sieht, es ist also egal, ob der Rest des Geräts auf Englisch bleibt.

Es gibt einen anderen Thread bei Change language programmatically in Android, aber es scheint nicht zu einer Schlussfolgerung zu kommen.

kann ich setzen. . .

Locale locale = new Locale(sTheNewLocale); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
getBaseContext().getResources().updateConfiguration(config, 
     getBaseContext().getResources().getDisplayMetrics()); 

. . . in onCreate() vor der setContentView() aber das hilft nicht wirklich, wenn ich das Gebietsschema ändern möchte, nachdem mein Bildschirm ausgeführt wird. Gibt es eine Möglichkeit, die Inhaltsansicht neu zu laden, nachdem die Aktivität bereits ausgeführt wurde? So ist gibt es keine praktische Möglichkeit, Gebietsschemas on-the-Fly zuverlässig zu ändern, oder muss ich meinem Chef sagen, dass es nicht getan werden kann, außer das gesamte Gerät auf das neue Gebietsschema vor dem Start der App zu setzen?

Antwort

15

Seit 11 API Sie recreate so verwenden können, können diese Methode in Ihrer Tätigkeit machen:

private void restartInLocale(Locale locale) 
{ 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    Resources resources = getResources(); 
    resources.updateConfiguration(config, resources.getDisplayMetrics()); 
    recreate(); 
} 
+1

Die Methode 'updateConfiguration()' ist veraltet. Hier ist eine nicht veraltete Lösung: http://stackoverflow.com/questions/40221711/android-context-getresources-updateconfiguration-deprecated – wilkas

+0

config.locale wird auch abgeschrieben –

+0

@HasanAliKaraca, die in der verknüpften Antwort auch abgedeckt ist. – weston

3

Sie können eine neue Instanz Ihrer Aktivität starten und die alte Instanz beenden. Hier ist ein vollständiges (ungetestetes) Beispiel, wie Sie eine beliebige Sprache speichern und Ihre App neu starten können. Sie müssen nur restartInLanguage mit Ihrer bevorzugten Sprache anrufen.

public class YourMainActivity extends Activity { 
    private static final String APP_SHARED_PREFS = "com.example.test"; 
    private SharedPreferences settings; 
    private Editor editor; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     settings=getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); 
     editor=settings.edit(); 

     Locale locale = new Locale(settings.getString("lang", "default-lang")); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 

     // your stuff... 
    } 

    public void restartInLanguage(String lang) { 
     editor.putString("lang", lang); 
     editor.commit(); 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 
    } 

    // ... 
} 
+0

verwendet werden Wo würde ich dies tun, aus?Das Programm beginnt in der Hauptaktivität. Wie würde dies das Gebietsschema des Hauptbildschirms ändern? Oder wollen Sie eine neue Instanz der Hauptaktivität aus der Hauptaktivität starten und dann die alte Hauptaktivität sich selbst töten lassen? (Kann das überhaupt gemacht werden?) – user316117

+0

Ja, so ist es ... Sie haben diesen Code oben in der * Sprache geändert Handler *, die Ihre Hauptaktivität neu gestartet. – rekire

+0

Ich kann deine Antwort immer noch nicht analysieren. Willst du sagen, dass ich meine Hauptaktivität * von * meiner Haupttätigkeit aus neu starten kann? Wie mache ich das? – user316117

0

Die Lösung ist setContentView und controlLanguage zu verwenden (Sie können diese Methode auch aus einer globalen Klasse aufrufen) Methoden in jeder Aktivität in OnResume-Methode nach dem Festlegen Ihrer Ländereinstellung. Beispiel:

@Override 
    public void onClick(View v) { 
     SharedPreferences.Editor editor; 
     editor = sharedPref.edit(); 
     Configuration config = new Configuration(getBaseContext().getResources().getConfiguration()); 
     String language = ""; 
     switch (v.getId()){ 
      case R.id.turkceButton: 
       editor.putString("language", "tr"); 
       language="tr"; 
       break; 
      case R.id.englishButton: 
       editor.putString("language", "en"); 
       language="en"; 
       break; 
     } 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     editor.commit(); 


@Override 
    protected void onResume() { 
     super.onResume(); 
     controlLanguage(getApplicationContext(), getResources()); 
     setContentView(R.layout.main); 
    } 

public void controlLanguage(Context context, Resources res){ 
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); 
     String language = sharedPref.getString("language","en"); 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 
     res.getConfiguration().locale = locale; 
     res.updateConfiguration(res.getConfiguration(), res.getDisplayMetrics()); 
    } 
1

I kombiniert haben @weston und @rekire (beide +1) und Extendet es diesen Anwendungsfall zu behandeln:

  • ACTIVITYA => ACTIVITYB => SettingsActivity-changeLocale

Nach changeLocale in SettingsActivity sollten die übergeordneten Aktivitäten ActivityA und ActivityB auch neu erstellt werden, um das neue Gebietsschema wiederzugeben.

Meine Lösung: ACTIVITYA und ACTIVITYB von LocalizedActivity erben, die in onResume überprüft, ob das Gebietsschema und lösen eine recreate() ggf.

So jede Aktivität hat sich verändert, die automatisch von LocalizedActivity erbt Griffe App spezifische locale ändern.

/** 
* An activity that can change the locale (language) of its content. 
* 
* Inspired by http://stackoverflow.com/questions/13181847/change-the-locale-at-runtime 
* 
* Created by k3b on 07.01.2016. 
*/ 
public class LocalizedActivity extends Activity { 
    /** if myLocale != Locale.Default : activity must be recreated in on resume */ 
    private Locale myLocale = null; 

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

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Locale has changed by other Activity ? 
     if ((myLocale != null) && (myLocale.getLanguage() != Locale.getDefault().getLanguage())) { 
      myLocale = null; 
      recreate(); 
     } 
    } 

    /** 
    * Set Activity-s locale to SharedPreferences-setting. 
    * Must be called before onCreate 
    * @param context 
    */ 
    public static void fixLocale(Context context) 
    { 
     final SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(context); 
     String language = prefs.getString(Global.PREF_KEY_USER_LOCALE, ""); 
     Locale locale = Global.systemLocale; // in case that setting=="use android-locale" 
     if ((language != null) && (!language.isEmpty())) { 
      locale = new Locale(language); // overwrite "use android-locale" 
     } 

     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      Resources resources = context.getResources(); 
      resources.updateConfiguration(config, resources.getDisplayMetrics()); 
      // recreate(); 

      if (context instanceof LocalizedActivity) { 
       ((LocalizedActivity) context).myLocale = locale; 
      } 
     } 
    } 
} 

Hier ist die Quelle von LocalizedActivity.java und SettingsActivity.java, die in meinem A Photo Manager project

Verwandte Themen