Meine Benutzer können das Gebietsschema in der App ändern (sie möchten möglicherweise ihre Telefoneinstellungen auf Englisch halten, aber den Inhalt meiner App auf Französisch, Niederländisch oder einer anderen Sprache lesen ...)
Warum funktioniert das in 1.5 / 1.6 einwandfrei, aber NICHT mehr in 2.0 ???
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case 201:
Locale locale2 = new Locale("fr");
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;
getBaseContext().getResources().updateConfiguration(
config2, getBaseContext().getResources().getDisplayMetrics());
// loading data ...
refresh();
// refresh the tabs and their content
refresh_Tab ();
break;
case 201: etc...
Das Problem ist, dass das MENÜ jedes Mal mehr "schrumpft", wenn der Benutzer die obigen Codezeilen durchläuft ...
Dies ist das Menü, das verkleinert wird:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 100, 1, "REFRESH").setIcon(android.R.drawable.ic_menu_compass);
SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);
langMenu.add(1, 201, 0, "Nederlands");
langMenu.add(1, 202, 0, "Français");
menu.add(0, 250, 4, R.string.OptionMenu2).setIcon(android.R.drawable.ic_menu_send);
menu.add(0, 300, 5, R.string.OptionMenu3).setIcon(android.R.drawable.ic_menu_preferences);
menu.add(0, 350, 3, R.string.OptionMenu4).setIcon(android.R.drawable.ic_menu_more);
menu.add(0, 400, 6, "Exit").setIcon(android.R.drawable.ic_menu_delete);
return super.onCreateOptionsMenu(menu);
}
Was muss ich in API Level 5 tun, damit dies wieder funktioniert?
HIER IST DER VOLLSTÄNDIGE CODE, WENN SIE DIESES TESTEN WOLLEN:
import java.util.Locale;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);
langMenu.add(1, 201, 0, "Nederlands");
langMenu.add(1, 202, 0, "Français");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 201:
Locale locale = new Locale("nl");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Nederlands !", Toast.LENGTH_LONG).show();
break;
case 202:
Locale locale2 = new Locale("fr");
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;
getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale en Français !", Toast.LENGTH_LONG).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
UND HIER IST DAS MANIFEST:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cousinHub.ChangeLocale"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
DAS HABE ICH GEFUNDEN:
<uses-sdk android:minSdkVersion="5" />
=> ES FUNKTIONIERT NUR FEIN ...
<uses-sdk android:minSdkVersion="3" />
=> Das Menü wird jedes Mal kleiner, wenn Sie das Gebietsschema ändern !!!
Was soll ich tun, wenn ich meine Anwendung für Benutzer unter 1.5 zugänglich halten möchte?
Antworten:
Bei der ursprünglichen Frage geht es nicht genau um das Gebietsschema selbst. Alle anderen Fragen zum Gebietsschema beziehen sich auf dieses. Deshalb wollte ich das Thema hier klären. Ich habe diese Frage als Ausgangspunkt für meinen eigenen Gebietsschema-Umschaltcode verwendet und festgestellt, dass die Methode nicht genau korrekt ist. Dies funktioniert jedoch nur bis zu einer Konfigurationsänderung (z. B. Bildschirmdrehung) und nur in dieser bestimmten Aktivität. Wenn ich eine Weile mit einem Code spiele, bin ich zu folgendem Ansatz gekommen:
Ich habe android.app.Application erweitert und den folgenden Code hinzugefügt:
Dieser Code stellt sicher, dass für jede Aktivität ein benutzerdefiniertes Gebietsschema festgelegt ist und dass es bei Rotation und anderen Ereignissen nicht zurückgesetzt wird.
Ich habe auch viel Zeit damit verbracht, die Änderung der Einstellungen so anzuwenden, dass sie sofort angewendet wird, aber es gelang mir nicht: Die Sprache wurde beim Neustart der Aktivität korrekt geändert, aber Zahlenformate und andere Gebietsschemaeigenschaften wurden erst nach dem vollständigen Neustart der Anwendung angewendet.
Änderungen an
AndroidManifest.xml
Vergessen Sie nicht
android:configChanges="layoutDirection|locale"
, jeder Aktivität bei AndroidManifest sowieandroid:name=".MyApplication"
dem<application>
Element etwas hinzuzufügen .quelle
config
undnewConfig
) zur Verfügung stellt. Sie sollten zuerst eine Kopie mitconfig = new Configuration(config);
erstellen. Ich habe gerade eine Stunde damit verbracht, diesen Code zu debuggen, bevor ich das Problem herausgefunden habe (es hat dazu geführt, dass die Aktivität endlos geflasht hat).updateConfiguration()
, sodass Ihre Aktivität manchmal in zwei verschiedenen Sprachen angezeigt wird (insbesondere in Dialogen). Weitere Informationen: stackoverflow.com/questions/39705739/…Nach einer erholsamen Nacht fand ich die Antwort im Web (eine einfache Google-Suche in der folgenden Zeile "
getBaseContext().getResources().updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics());
"), hier ist sie:Linktext => Dieser Link zeigt auch,
screenshots
was passiert!Dichte war hier das Problem , ich musste dies in der AndroidManifest.xml haben
Das wichtigste ist das Android: anyDensity = "true" .
Vergessen Sie nicht,
AndroidManifest.xml
für jede Aktivität Folgendes hinzuzufügen: (für Android 4.1 und niedriger):Diese Version wird benötigt, wenn Sie hier eine Erklärung für Android 4.2 (API Level 17) erstellen :
quelle
activity.recreate()
In Android M funktioniert die Top-Lösung nicht. Ich habe eine Hilfsklasse geschrieben, um das zu beheben, was Sie von Ihrer Anwendungsklasse und allen Aktivitäten aufrufen sollten (ich würde vorschlagen, eine BaseActivity zu erstellen und dann alle Aktivitäten von dieser zu erben.
Hinweis : Dies unterstützt auch die richtige RTL-Layoutrichtung.
Hilfsklasse:
Anwendung:
BaseActivity:
quelle
BaseActivity()
Konstruktor nicht aufrufensuper()
?<application android:name=".App">
des Manifests? Wie wäre es,android:configChanges="layoutDirection|locale"
zu jeder Aktivität im Manifest etwas hinzuzufügen ?Dies ist für meinen Kommentar zu Andreys Antwort, aber ich kann keinen Code in die Kommentare aufnehmen.
Wird Ihre bevorzugte Aktivität von Ihrer Hauptaktivität aufgerufen? Sie könnten dies in den Lebenslauf setzen ...
quelle
activity.recreate()
recreate()
Methode, die Sierecreate()
anstelle vonrefresh()
in Ihrem Code verwenden. Dies wird Ihre 3 Codezeilen inrefresh()
MethodeIch konnte android: anyDensity = "true" nicht verwenden, da Objekte in meinem Spiel völlig anders positioniert wären ... anscheinend ist dies auch der Trick:
quelle
code Locale.setDefault(mLocale); Configuration config = getBaseContext().getResources().getConfiguration(); if (!config.locale.equals(mLocale)) { config.locale = mLocale; getBaseContext().getResources().updateConfiguration(config, null); }
Wenn Sie die Menüoptionen zum sofortigen Ändern des Gebietsschemas beeinflussen möchten, müssen Sie dies tun.
quelle
onMenuOpened
sollte nach dem Gebietsschemawechsel nur einmal aufgerufen werden.