web-dev-qa-db-fra.com

android: configChanges = "orientation" ne fonctionne pas avec les fragments

J'essaie simplement d'adapter certaines de mes applications à HoneyComb.

Le problème auquel je suis confronté est la destruction de mon activité sur le changement d'orientation (paysage/portrait)

Quand j’utilisais une activité classique, j’écrivais dans le manifeste:

Mais maintenant, toutes ces lignes ne fonctionnent plus!

Y at-il une solution de contournement pour cela?

Mon 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

Basé sur mon expérience avec Honeycomb 3.0 et la bibliothèque de compatibilité (r1).

configChange="orientation" fonctionne avec des fragments afin d'empêcher que l'activité (à laquelle elle s'applique) soit recréée lors d'un changement d'orientation. Si vous souhaitez que la variable fragment ne soit pas recréée lors de la recréation d'activités, appelez setRetainInstance dans onCreate.

Sauf si quelque chose me manque, je ne comprends pas tout à fait votre deuxième entrée dans le manifeste, AppListFragment n'est-il pas Fragment? Si c'est le cas, pourquoi est-il répertorié en tant qu'entrée dans votre manifeste?

Voir SO Réponse pour connaître les nouveaux qualificateurs susceptibles de causer ce problème si vous ciblez sdk 13, suggérez d'essayer Android:configChanges="orientation|screenSize" 

76
PJL

J'ai eu un problème très similaire, mais j'ai dû faire quelques ajouts pour le faire fonctionner avec différentes versions (y compris ICS).

Dans l'activité principale de l'application, j'ai ajouté une version légèrement différente de celle proposée par Jason.

<activity
Android:name=".MyMainActivity"
Android:configChanges="orientation|keyboardHidden|screenSize" 
Android:label="@string/app_name" >

J'ai eu ce travail sur pré-Honeycomb avec:

           <activity
        ....
        Android:configChanges="orientation|keyboardHidden" 
        .... >

Je devais faire le premier exemple pour le faire fonctionner sur toutes les versions. J'utilise actuellement des fragments et ActionBarSherlock pour assurer la compatibilité ascendante.

J'ai aussi changé la façon dont je sauvegardais et rechargeais:

        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;
    }

Le code de la méthode d'état de l'instance de sauvegarde:

       @Override
    public void onSaveInstanceState(Bundle outState)
    {
        if(webview.saveState(outState) == null)
            Log.i(tag,"Saving state FAILED!");
        else
            Log.i(tag, "Saving state succeeded.");      
    }

J'espère que cela t'aides.

37

Jusqu'à l'API 13, l'attribut configChanges était doté d'une nouvelle valeur, screenSize

Donc, si vous utilisez de grands écrans, veillez à ajouter screenSize dans votre attribut configChanges:

        Android:configChanges="orientation|keyboardHidden|screenSize"
34
Thomas Gatt

À partir de Android 3.2 (API niveau 13), la "taille de l'écran" change également lorsque l'appareil bascule entre l'orientation portrait et orientation paysage. Ainsi, si vous souhaitez empêcher les redémarrages d'exécution en raison d'un changement d'orientation lors du développement pour l'API de niveau 13 ou supérieur (comme indiqué par les attributs minSdkVersion et targetSdkVersion), vous devez inclure la valeur "screenSize" en plus de la valeur "orientation". Autrement dit, vous devez décaler Android: configChanges = "orientation | screenSize". Toutefois, si votre application cible une API de niveau 12 ou inférieur, votre activité gère toujours cette modification de configuration elle-même (cette modification de configuration ne redémarre pas votre activité, même si elle est exécutée sur un périphérique Android 3.2 ou supérieur).

9
Aarun

J'avais ce même problème (c'est-à-dire le redémarrage de l'activité) même sans fragments. 

J'ai changé:

Android:configChanges="orientation|keyboardHidden"

à:

Android:configChanges="orientation|keyboardHidden|screenSize" 

Cela empêche l'activité de redémarrer.

4
Eric Fettman

Je sais que la réponse est assez tardive, mais j’ai récemment fait face à ce problème et j’ai pu le résoudre pour l’activité Fragment.

1) En manifeste, 

      Android:configChanges="orientation|keyboardHidden|screenSize"

2) Dans le fichier de classe, remplacez onSaveInstanceState (Bundle outState). C'est tout! Prendre plaisir :)

1
Prachi

Dans le fichier manifeste, dans l'activité, ajoutez cette ligne.
Android: configChanges = "keyboard | keyboardHidden | orientation | screenSize". 

0
R.S