Donnerstag, Mai 28, 2020

Android-Benutzer-Gebietsschema immer wieder nach onCreate?

Ich will eine konfigurierbare Sprache Einstellungen in meiner app.

So, in onCreate meiner Tätigkeit, ich nenne Ressourcen.updateConfiguration
mit dem neuen Gebietsschema.

Jedoch nach onCreate (in einiger Zeit, kann ich es nicht finden wenn), die
Gebietsschema eingestellt ist wieder auf die Standard-locale.

Auf dem code-Beispiel unten, die Zeichenfolgen dargestellt, die in das Haupt-layout (als
aufgeblasen durch setContentView) zeigt die
„in“ language version, ABER wenn ich drücken Sie die Menü-Taste, auf die
onCreateMenu heißt, die Saiten –
entnommen aus „en“ (Standard) locale.

Das log zeigt dies:

 18337               oncreate  D  { scale=1.0 imsi=525/1 loc=intouch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=143}
 30430        ActivityManager  I  Displayed activity yuku.coba.locale/.CobaLocaleActivity: 266 ms (total 266 ms)
 18337        KeyCharacterMap  W  No keyboard for id 65540
 18337        KeyCharacterMap  W  Using default keymap: /system/usr/keychars/qwerty.kcm.bin
 18337                 onmenu  D  { scale=1.0 imsi=525/1 loc=en_GB touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=143}

Zwischen „oncreate“ und „onmenu“, wird die locale auf Magische Weise ändert.

Bitte helfen, ich habe seit neuestem mit diesem mit kein Glück.

Code-snippet:

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

       Configuration c = new Configuration();
       c.locale = new Locale("in");
       getResources().updateConfiguration(c, null);

       setContentView(R.layout.main);
       Log.d("oncreate", getResources().getConfiguration().toString());
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
       Log.d("onmenu", getResources().getConfiguration().toString());
       new MenuInflater(this).inflate(R.menu.utama, menu);

       return true;
   }
  • Dieses problem scheint nicht zu erscheinen, auf 1.5-emulator, kommt aber auf 2.2 Nexus One.
  • Hi, ich habe das gleiche proble. Hast du eine Lösung finden?

4 Kommentare

  1. 1

    Jedes 100ms-reset der Konfiguration 🙂

    • Danke. Was ich jetzt mache ist reset nach 200 ms und reset nach 400 ms. Nach, dass keine Notwendigkeit, um wieder zurückzusetzen. Es scheint zu funktionieren 😀
    • Toll 🙂 ich habe noch ein problem auf meinem Nexus – wenn ich ändern Sie die Ausrichtung zu Querformat, meine app nicht ändern das layout, um das layout habe ich in den layout-Ordner landen. Tun Sie das gleiche problem haben?
    • Das problem mit der Orientierung war mein blöder Fehler – zu Testzwecken lege ich android:configChanges=“orientation|locale|etc…“ im manifest, und fergot darüber.
    • fhucho, eine weitere Sache, die wir tun müssen, ist onConfigurationChange, die locale zu sein scheinen, auf die Standardeinstellungen zurücksetzen. Stellen Sie sicher, um ihn zu zwingen back.
  2. 0

    Ich Rat nicht erzwingen, das Gebietsschema an, dass etwas anders ist von der Geräte-Einstellung. Läuft man in Probleme. Sie können bewegen Sie Ihren Aufruf von onResume. Es wird besser sein, aber noch sind Sie gonna Kampf Geräte-Konfiguration. Wieder. Tun Sie das nicht .

    • In einem Fall ist, weil meine app enthält Indonesischer Sprache, eine Sprache, die derzeit nicht verfügbar auf den meisten Handys. Trotzdem viele Indonesier soll die Anwendung in Ihrer eigenen Sprache, obwohl das Telefon selbst nicht unterstützen.
    • Ich verstehe den Fall. Leider, in meiner Erfahrung, es funktioniert nicht sehr gut. Ich habe versucht, das gleiche zu tun einige Zeit her, aber im Grunde aufgegeben, weil aller Verrücktheit, die es verursachte.
    • Danke, aber für jetzt habe ich, was fhucho sagte, und es scheint OK zu sein (habe versucht im emulator 1.5, 1.6, 2.1, und mein Handy 2.2). Vielleicht wird es einige wierdness wenn ich mit es für komplexere Anwendung ist, aber jetzt funktioniert es 🙂
  3. 0

    statt
    getResources().updateConfiguration(c, null);

    versuchen
    getBaseContext().getResources().updateConfiguration(c, null);

    (nicht getDefaultContext sorry)

    • Sie beziehen sich auf das gleiche Objekt.
  4. 0

    Können Sie verwenden eine Methode, die ich schrieb, um diese situation zu behandeln:

    /**
         * Sets app language locale also taking account system resets of the Locale; Resetting of the Locale is done right after onResume of the first Activity that is run in the application.
         * So... if the AppLanugage is set e.g. in first activitys onCreate method, this language will be reset shortly after; To counter this the method starts the Timer (if a flag is set) to
         * handle pottential Locale resets that are done by the system.
         * 
         * In case the flag alsoReloadAfterDelay is set, usually the numberOfResetsOsDoes parameter and the numberOfResetsOsDoes should be used separately from eachother; Either the timer
         * shoudl run till the numberOfResetsOsDoes is matched, or run till the timer runs out of time, irrespectively of the number of resets the os does
         * @param appContext    The application context
         * @param lang  New language to set the locale
         * @param alsoReloadAfterDelay  The flag that says whether to start a timer that will handle pottential Locale resets, that are done by Android OS;
         * @param numberOfResetsOsDoes  The number of resets the OS does after onResume method of the first activity; So far I noticed that it is happening twice (emulator 2.3.3)
         * @param resetTimerDuration    The duration of the reset timer;
         * @see <a href="https://groups.google.com/forum/?hl=en#!topic/android-developers/VEAWMCdyIWg">https://groups.google.com/forum/?hl=en#!topic/android-developers/VEAWMCdyIWg</a> 
         * @return  True if the operation succeded (if the given lang param was appliable for instance); False otherwise
         */
        public static boolean setAppLanguageLocale(final Context appContext, final String lang, boolean alsoReloadAfterDelay, final int numberOfResetsOsDoes, int resetTimerDuration)
        {       
            final String previousAppLanguage = getAppLanguage(appContext);
            final String newLang = lang.toUpperCase(Locale.US);
    
            if(previousAppLanguage.equals(newLang))
                return true;
    
            setAppLanguageLocaleP(appContext, lang);
    
            if(alsoReloadAfterDelay)
            {               
                new CancellableCountDownTimer(resetTimerDuration, 10)
                {
                    private int aResetCounter = 0;
    
                    @Override
                    public void onTick(long millisUntilFinished)
                    {
                        if(aResetCounter == numberOfResetsOsDoes)
                        {
                            this.cancel();
                            return;
                        }
    
                        String currentAppLanguage = getAppLanguage(appContext);
    
                        if(!currentAppLanguage.equals(newLang))
                        {
                            aResetCounter++;
    
                            setAppLanguageLocale(appContext, lang);
                        }
                    }
    
                    @Override
                    public void onFinish()
                    {                   
                    }
                }.start();
            }
    
            return true;
        }

Kostenlose Online-Tests