web-dev-qa-db-fra.com

Restaurer l’état de TextView après la rotation de l’écran?

Dans mon application, j'ai TextView et EditText. Les deux contiennent des données. Lorsque l'orientation de l'écran change, les données de la EditText restent, mais les données TextView sont effacées.

Quelqu'un peut-il m'aider à trouver un moyen de conserver des données dans TextView aussi?

102
kAnNaN

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

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

D'après la documentation sur freezesText :

Si elle est définie, la vue de texte inclura son texte complet actuel à l'intérieur de son glaçon gelé en plus des métadonnées telles que la position actuelle du curseur. Par défaut, cela est désactivé. cela peut être utile lorsque le contenu d'une vue de texte n'est pas stocké dans un emplacement persistant tel qu'un fournisseur de contenu

215
inazaruk

Afin de conserver les données sur le changement d'orientation, vous devez implémenter 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);
}
27
Eric Nordvik

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

Vous pouvez utiliser dans une activité pour enregistrer des valeurs

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

et utiliser quelque chose comme ceci dans la méthode oncreate d'une activité pour charger les objets sauvegardés

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

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

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

1) Toutes les vues avec un identifiant n'enregistrent pas leur état. Les widgets Android, avec un identifiant, dont l’état peut être modifié par l’utilisateur, semblent enregistrer leur état lors d’une destruction à mort. Donc EditText enregistre son état, mais TextView n'enregistre pas son état lors d'une suppression à mort.

"Pour autant que je sache, Android ne se soucie que de la sauvegarde de l'état des modifications attendues C'est pourquoi il enregistre le texte dans un EditText (qu'un utilisateur est susceptible de modifier ) Et n'enregistre peut-être pas l'état TextView (qui reste normalement statique) "

Mark M

Vous pouvez donc choisir de sauvegarder l'état de la vue texte dans onSaveInstanceState et de restaurer l'état de la vue texte dans onCreate.

2) La meilleure pratique est de sauvegarder l’état d’instance "interne" sans affichage, même si vous déclarez

Android:configChanges= "orientation|keyboardHidden" 

De la docs:

"Cependant, votre application doit toujours pouvoir s'arrêter et redémarrer avec son état précédent intact. Non seulement parce qu'il y a d'autres modifications de configuration que vous ne pouvez pas empêcher de redémarrer votre application, mais également afin de gérer des événements tels que celui où l'utilisateur reçoit un message entrant. appel téléphonique, puis retourne à votre application. "

JAL

6
JAL

Modifiez vos activités dans AndroidManifest.xml pour remplacer le comportement de changement d'orientation en ajoutant ceci à votre activité/activités

Android:configChanges="orientation|keyboardHidden"

Cela devrait ressembler un peu à ça:

    <activity Android:name=".activity.LoginActivity"
              Android:configChanges="orientation|keyboardHidden"
              Android:label="@string/app_name">
    </activity>
1
Joakim Berglund

Ajoutez-les à AndroidManifest.xml
Indiquez le nom de votre activité à la place de Nom_Activité

<activity Android:name="Activity_Name"
        Android:screenOrientation="sensor"
        ...
        Android:configChanges="orientation|keyboardHidden|screenSize">

Cela fonctionnera également avec la valeur changeante de TextField.

0
Rahul Krishna

il suffit d'ajouter

Android:configChanges="orientation|screenSize"

à votre activité dans AndroidManifest.xml.

0
farhad.kargaran