2016-08-03 1 views
0

Je développe une application dans laquelle les utilisateurs remplissent un formulaire avec des photos et quelques questions oui/non. Lorsque oui est sélectionné, vous devez ajouter des informations supplémentaires dans un dialogue. Ensuite, cette information est insérée dans un TextView et ce TextView inséré dans un LinearLayout. Le problème est que, lorsque l'utilisateur passe à une autre application, cet écran passe en arrière-plan et est ensuite détruit par Android (car le système a besoin de mémoire). Ensuite, lorsque l'utilisateur revient à l'application, la méthode onRestoreInstanceState() est appelée, ramenant certaines variables mais pas le TextView à l'intérieur de LinearLayout. J'utilise des annotations Android pour renvoyer ces variables. Comment restaurer ces vues Android?onRestoreInstanceState Ne recharge pas toutes les vues

<LinearLayout 
       android:id="@+id/estoque_zerado_pergunta_layout" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:visibility="visible"> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/existe_estoque_zerado" 
        android:textSize="@dimen/abc_text_size_large_material" 
        android:layout_margin="5dp"/> 

       <RadioGroup 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal"> 

        <RadioButton 
         android:id="@+id/radio_estoque_zerado_sim" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="@string/sim" /> 

        <RadioButton 
         android:id="@+id/radio_estoque_zerado_nao" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:checked="true" 
         android:text="@string/nao"/> 

       </RadioGroup> 

      </LinearLayout> 

      <LinearLayout 
       android:id="@+id/estoque_zerado_layout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:visibility="gone" > 

       <LinearLayout 
        android:id="@+id/estoque_zerado_itens_layout" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="vertical" > 

        <!--Lista de itens aqui--> 

       </LinearLayout> 

       <LinearLayout 
        android:id="@+id/add_estoque_zerado_item" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal" 
        android:padding="5dp" > 

        <ImageView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:paddingRight="10dp" 
         android:src="@drawable/ic_adicionar" 
         android:contentDescription="@string/adicionar_estoque_zerado"/> 

        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="match_parent" 
         android:gravity="center_vertical" 
         android:text="@string/adicionar_estoque_zerado" 
         android:textSize="@dimen/abc_text_size_medium_material" /> 

       </LinearLayout> 

      </LinearLayout> 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    Log.d("onRestoreInstanceState", "onRestoreInstanceState: chamou onRestoreInstanceState");} 

    @Override 
public void onSaveInstanceState(Bundle bundle) { 
    super.onSaveInstanceState(bundle); 
    Log.d("onSaveInstanceState", "onSaveInstanceState: chamou onSaveInstanceState");} 

Désolé pour mon anglais débutant. Merci d'avance.

+0

vous avez 'android: visibilité = "gone"' sur votre mise en page est-ce normal? –

+0

C'est un prérequis. Chaque question ne devrait apparaître qu'après la réponse précédente. –

+0

pouvez-vous vous assurer que votre linearLayout n'est pas restauré? (En utilisant [Hierarchy View] (https://developer.android.com/studio/profile/hierarchy-viewer.html) par exemple) –

Répondre

0

Comme je sais onRestoreInstanceState ne restaure pas votre point de vue. onCreate et onRestoreInstanceState utilise le même Bundle afin d'initialiser vos vues et de vérifier savedInstanceState dans onCreate. Consultez les documents ci-dessous.

https://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState(android.os.Bundle)

https://developer.android.com/training/basics/activity-lifecycle/recreating.html#RestoreState

+0

"L'implémentation par défaut de cette méthode effectue une restauration de tout état d'affichage précédemment gelé par onSaveInstanceState (Bundle).". C'est par le premier lien que vous m'avez donné, abou onRestoreInstanceState. De la même page: "L'implémentation par défaut prend en charge la plupart des états UI par instance en appelant onSaveInstanceState() sur chaque vue de la hiérarchie qui a un ID, et en enregistrant l'ID de la vue actuellement focalisée. (tout cela est restauré par l'implémentation par défaut de onRestoreInstanceState (Bundle)). " C'est à propos de onSaveInstanceState. –

+0

Le fait est que certaines vues sont restaurées, seules les images linéaires à l'intérieur de linearlayout ne sont pas restaurées. –

+1

Après avoir testé certaines situations, j'ai changé le code dans onRestoreInstanceState en onCreate, puis les textview sont restaurés maintenant. Merci. –

0

Basé sur https://developer.android.com/training/basics/activity-lifecycle/recreating.html

Vous devez enregistrer les variables que vous voulez revenir. à onSaveInstanceState vous enregistrez vos données

static final String SAVE_STRING = "string_to_save"; 
... 
@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save variable value on bundle 
    savedInstanceState.putInt(SAVE_STRING, yourstring); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

alors vous pouvez les récupérer dans onRestoreInstanceState

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    // Always call the superclass so it can restore the view hierarchy 
    super.onRestoreInstanceState(savedInstanceState); 

    // Restore state members from saved instance 
    yourstring = savedInstanceState.getInt(SAVE_STRING); 
} 
+0

Je sauvegarde toutes les variables dont j'avais besoin, le problème est le textview à l'intérieur de linearlayout. –

+0

vous avez Android: visibilité = "gone" sur votre deuxième LinearLayout est-ce normal? –