web-dev-qa-db-de.com

android: configChanges = "Orientierung" funktioniert nicht mit Fragmenten

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"  />
57
Waza_Be

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" 

76
PJL

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.

37

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"
34
Thomas Gatt

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).

9
Aarun

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.

4
Eric Fettman

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 :)

1
Prachi

In der Manifest-Datei fügen Sie in der Aktivität diese Zeile hinzu
Android: configChanges = "keyboard | keyboardHidden | orientierung | screenSize". 

0
R.S