106 votes

La restauration de l'état de TextView après la rotation de l'écran?

Dans mon application j'ai Textview et EditView. Les deux ont des données. Lorsque l'orientation de l'écran change les données en Editview reste, mais Textview les données sont effacées.

Je suis confus ...

Peut quelqu'un m'aider à trouver un moyen de conserver les données en TextView trop?

226voto

inazaruk Points 37760

Si vous voulez forcer votre TextView enregistrer son état, vous devez ajouter freezesText d'attribut:

<TextView 
     ... 
     android:freezesText="true" />

À partir de la documentation sur freezesText :

Si il est activé, l'affichage du texte de l'actuel texte complet à l'intérieur de son congelés glaçon en plus des méta-données telles que la position actuelle du curseur. Par défaut, il est désactivé; il peut être utile lorsque le contenu d'un affichage de texte n'est pas stocké dans un persistant place comme un fournisseur de contenu

28voto

Eric Nordvik Points 6975

Afin de conserver les données sur le changement d'orientation vous avez besoin pour mettre en œuvre les deux méthodes:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}

6voto

Kevin Points 602

Android ne gère pas ce genre de choses pour vous. Vous devez sauvegarder toutes les données manuellement.

Vous pouvez l'utiliser dans une activité à enregistrer les valeurs

@Override
    public Object onRetainNonConfigurationInstance() {
        HashMap<String, Object> savedValues = new HashMap<String, Object>();
        savedValues.put("someKey", someData);           
        return savedValues;
    }

et utiliser quelque chose comme cela dans la méthode oncreate de l'activité pour charger des objets sauvés

HashMap < String, Object> savedValues 
     = (HashMap<String, Object>)this.getLastNonConfigurationInstance();

vous pouvez également choisir de désactiver le changement d'orientation pour une activité

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

6voto

JAL Points 2276

1) tous les points de vue avec un ID d'enregistrer leur état. Des widgets Android, avec un ID, dont l'état peut être modifié par l'utilisateur, affiche pour enregistrer leur état sur un doux tuer. Donc EditText enregistre son état, mais TextView ne pas enregistrer son état sur un doux tuer.

"Autant que je sache, Android seulement dérange enregistrement de l'état de choses qui sont attendus à changement. C'est pourquoi, il enregistre le texte dans un EditText (dont un utilisateur est susceptibles de changer) et peut-être de ne pas enregistrer l'état d'un TextView (qui normalement reste statique)"

Marque M

Vous pouvez ainsi choisir d'enregistrer l'état de la textview dans onSaveInstanceState et vous pouvez choisir de restaurer l'état de la textview dans onCreate.

2) la Meilleure pratique consiste à enregistrer "interne" non affichage de l'état de l'instance, même si vous déclarez

android:configChanges= "orientation|keyboardHidden" 

À partir de la documentation:

"Toutefois, votre demande doit toujours être en mesure d'arrêter et de redémarrer avec son état précédent intacte. Non seulement parce qu'il y a d'autres modifications de configuration que vous ne pouvez pas vous empêcher de redémarrer votre application, mais aussi pour gérer des événements tels que lorsque l'utilisateur reçoit un appel téléphonique entrant et retourne ensuite à votre demande."

JAL

1voto

Joakim Berglund Points 1815

Modifier vos activités dans AndroidManifest.xml pour remplacer l'orientation de modifier ce comportement en ajoutant ceci à votre activité:

android:configChanges="orientation|keyboardHidden"

Il devrait ressembler à quelque chose comme ceci:

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X