2016-08-03 10 views
0

Ich entwickle eine Anwendung, wo Benutzer ein Formular mit Fotos und ein paar Ja/Nein-Fragen ausfüllen. Wenn Ja ausgewählt ist, müssen Sie zusätzliche Informationen in einem Dialog hinzufügen. Dann wird diese Information in eine TextView eingefügt und diese TextView in eine LinearLayout eingefügt.onRestoreInstanceState Nicht alle Ansichten neu laden

Das Problem ist, wenn der Benutzer zu einer anderen Anwendung wechselt dieser Bildschirm in den Hintergrund und wird später von Android zerstört (weil das System Speicher benötigt). Wenn dann der Benutzer zu der Anwendung zurückkehrt, wird die onRestoreInstanceState()-Methode aufgerufen, die einige Variablen, aber nicht die TextView innerhalb LinearLayout zurückbringt. Ich verwende Android-Annotationen, um diese Variablen zurückzugeben. Wie stelle ich diese Android-Ansichten wieder her?

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

Sorry für meine Anfänger Englisch. Vielen Dank im Voraus.

+0

Sie haben 'android: Sichtbarkeit = "weg"' auf der Anlage ist das normal? –

+0

Es ist eine Voraussetzung. Jede Frage sollte erst erscheinen, nachdem die vorherige beantwortet wurde. –

+0

können Sie sicherstellen, dass Ihr linearLayout nicht wiederhergestellt wird (z. B. mithilfe von [Hierarchieansicht] (https://developer.android.com/studio/profile/hierarchy-viewer.html)) –

Antwort

0

abrufen Wie ich onRestoreInstanceState kennt Ihre Ansichten nicht wiederherstellen. onCreate und onRestoreInstanceState verwendet die gleichen Bundle so initialisieren Sie Ihre Ansichten und überprüfen Sie savedInstanceState in onCreate. Überprüfen Sie die Dokumente unten.

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

"Die Standardimplementierung dieser Methode führt eine Wiederherstellung jedes Ansichtsstatus durch, der zuvor von onSaveInstanceState (Bundle) eingefroren wurde." Dies ist der erste Link, den Sie mir gegeben haben, about onRestoreInstanceState. Und von derselben Seite: "Die Standardimplementierung kümmert sich um den Großteil des UI-Instanzzustands für Sie, indem onSaveInstanceState() für jede Ansicht in der Hierarchie mit einer ID aufgerufen und die ID der aktuell fokussierten Ansicht gespeichert wird (alles wird durch die Standardimplementierung von onRestoreInstanceState (Bundle) wiederhergestellt). " Hier geht es um onSaveInstanceState. –

+0

Der Punkt ist, einige Ansichten sind wiederhergestellt, nur die Textansicht im Inneren linearlayout werden nicht wiederhergestellt. –

+1

Nachdem ich einige Situationen getestet habe, habe ich den Code in onRestoreInstanceState in onCreate geändert, dann werden die Textansichten jetzt wiederhergestellt. Vielen Dank. –

0

Basierend auf https://developer.android.com/training/basics/activity-lifecycle/recreating.html

Sie haben Variable, die Sie zurück erhalten möchten zu speichern. in onSaveInstanceState speichern Sie Ihre Daten

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

dann können Sie sie in 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

Ich speichere alle Variablen, die ich brauchte, das Problem ist die Textansicht innerhalb von linearlayout. –

+0

Sie haben Android: Sichtbarkeit = "Gone" auf Ihrem zweiten LinearLayout ist das normal? –

Verwandte Themen