Ich versuche nur, einige meiner Anwendungen für HoneyComb anzupassen.
Das Problem, vor dem ich stehe, ist die Zerstörung meiner Tätigkeit bei Orientierungsänderungen (Landschaft/Porträt).
Als ich eine klassische Aktivität verwendete, schrieb ich im Manifest:
Aber jetzt funktionieren alle diese Zeilen nicht mehr!
Gibt es eine Problemumgehung dafür?
Mein Code:
<activity Android:name=".TwitterActivity" Android:label="@string/app_name"
Android:configChanges="keyboardHidden|orientation" />
<activity Android:name=".TwitterActivity$AppListFragment"
Android:configChanges="keyboardHidden|orientation" />
Basierend auf meinen Erfahrungen mit Honeycomb 3.0 und der Kompatibilitätsbibliothek (r1).
configChange="orientation"
arbeitet mit Fragmenten, um zu verhindern, dass die Aktivität (auf die sie angewendet wird) bei einer Orientierungsänderung neu erstellt wird. Wenn Sie möchten, dass die fragment
nicht erneut erstellt wird, rufen Sie setRetainInstance
in onCreate
auf.
Wenn mir nicht etwas fehlt, kann ich Ihren zweiten Manifesteintrag nicht ganz erhalten, ist AppListFragment
keine Fragment
? Wenn ja, warum wird es als Eintrag in Ihrem Manifest aufgeführt?
Siehe SO Antwort für neue Qualifikationsmerkmale, die dies wahrscheinlich verursachen werden, wenn Sie Sdk 13 anvisieren, schlagen Sie den Versuch vor Android:configChanges="orientation|screenSize"
Ich hatte ein sehr ähnliches Problem, musste jedoch ein paar Ergänzungen hinzufügen, damit es mit verschiedenen Versionen (einschließlich ICS) funktioniert.
In der Hauptaktivität der App habe ich eine etwas andere Version von Jason hinzugefügt.
<activity
Android:name=".MyMainActivity"
Android:configChanges="orientation|keyboardHidden|screenSize"
Android:label="@string/app_name" >
Ich hatte diese Arbeit an Pre-Honeycomb mit:
<activity
....
Android:configChanges="orientation|keyboardHidden"
.... >
Ich musste das erste Beispiel machen, um es auf allen Versionen zum Laufen zu bringen. Ich verwende derzeit Fragmente und ActionBarSherlock für die Abwärtskompatibilität.
Ich habe auch die Art und Weise geändert, wie ich gespeichert und neu geladen habe:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Set up webview object
View v = inflater.inflate(R.layout.webview_layout, container, false);
webview = (WebView)v.findViewById(R.id.webview_fragment);
webview.getSettings().setJavaScriptEnabled(true);
// Check to see if it has been saved and restore it if true
if(savedInstanceState != null)
{
if (savedInstanceState.isEmpty())
Log.i(tag, "Can't restore state because bundle is empty.");
else
{
if (webview.restoreState(savedInstanceState) == null)
Log.i(tag, "Restoring state FAILED!");
else
Log.i(tag, "Restoring state succeeded.");
}
}
else
{
// Load web page
webview.setWebViewClient(new MyWebViewClient());
webview.getSettings().setPluginsEnabled(true);
webview.getSettings().setBuiltInZoomControls(false);
webview.getSettings().setSupportZoom(false);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setDomStorageEnabled(true);
webview.loadUrl(mTabURL);
}
return v;
}
Der Code für die Methode zum Speichern der Instanzinstanz:
@Override
public void onSaveInstanceState(Bundle outState)
{
if(webview.saveState(outState) == null)
Log.i(tag,"Saving state FAILED!");
else
Log.i(tag, "Saving state succeeded.");
}
Hoffe das hilft.
Bis zu API 13 gab es einen neuen Wert für das configChanges-Attribut, screenSize
Wenn Sie große Bildschirme verwenden, müssen Sie also screenSize zu Ihrem configChanges-Attribut hinzufügen:
Android:configChanges="orientation|keyboardHidden|screenSize"
Ab Android 3.2 (API Level 13) ändert sich auch die "Bildschirmgröße", wenn das Gerät zwischen Hoch- und Querformat wechselt. Wenn Sie bei der Entwicklung für API-Level 13 oder höher (wie durch die Attribute minSdkVersion und targetSdkVersion deklariert) Laufzeitneustarts aufgrund von Orientierungsänderungen verhindern möchten, müssen Sie daher zusätzlich zum Wert "Orientation" den Wert "screenSize" angeben. Das heißt, Sie müssen Android dekalieren: configChanges = "direction | screenSize". Wenn Ihre Anwendung jedoch auf API-Level 12 oder niedriger abzielt, behandelt Ihre Aktivität diese Konfigurationsänderung immer selbst (diese Konfigurationsänderung startet Ihre Aktivität nicht neu, auch wenn sie auf einem Android-Gerät der Version 3.2 oder höher ausgeführt wird).
Ich hatte das gleiche Problem (d. H. Aktivität wurde neu gestartet), auch ohne Fragmente.
Ich habe mich verändert:
Android:configChanges="orientation|keyboardHidden"
zu:
Android:configChanges="orientation|keyboardHidden|screenSize"
Dadurch wird verhindert, dass die Aktivität erneut gestartet wird.
Ich weiß, dass dies eine recht späte Antwort ist, aber vor kurzem stand ich vor diesem Problem und konnte dieses Problem für Fragment Activity lösen.
1) In Manifest,
Android:configChanges="orientation|keyboardHidden|screenSize"
2) Überschreiben Sie in der Class-Datei den onSaveInstanceState (Bundle outState). Das ist es! Genießen :)
In der Manifest-Datei fügen Sie in der Aktivität diese Zeile hinzu
Android: configChanges = "keyboard | keyboardHidden | orientierung | screenSize".