2015-07-21 6 views
6

La mia comprensione era che tutte le viste standard con un ID dovevano salvare automaticamente il loro stato, e dopo aver provato questo su un esempio ho trovato che fosse piuttosto confuso.Perché TextView (con un ID) non salva automaticamente il suo stato?

Avevo solo 1 attività e il layout principale come elencato di seguito.
Quando cambio il testo di TextView facendo clic sul pulsante e quindi ruotando lo schermo, il TextView salva effettivamente il suo stato, ma dopo una rotazione, si reimposta allo stato predefinito.

stesso accade se modifico mentre nel paesaggio e ruotare: dopo la prima rotazione si salva ancora è stato, ma dopo l'altra rotazione (a meno che non posso cambiare ancora una volta il testo) si ripristina al valore predefinito.

Sono davvero confuso ora. Qualcuno potrebbe spiegarmi questo comportamento? Non sono stato in grado di trovare altre domande (o risposte) che spieghino questo comportamento specifico.

activity_main.xml:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity"> 

    <TextView 
     android:id="@+id/activity_main_textView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:maxLines="2" 
     android:text="test" 
     android:textSize="50sp" 
     /> 

    <EditText 
     android:id="@+id/activity_main_editText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:maxLength="30" 
     android:maxLines="1" 
     /> 

    <Button 
     android:id="@+id/activity_main_button" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:text="Set text" 
     /> 

</RelativeLayout> 

MainActivity.java:

package com.example.viewstatetest; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    private TextView textView; 
    private EditText editText; 
    private View button; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     textView = (TextView) findViewById(R.id.activity_main_textView); 
     editText = (EditText) findViewById(R.id.activity_main_editText); 
     button = findViewById(R.id.activity_main_button); 


     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       textView.setText(editText.getText()); 
      } 
     }); 
    } 
} 
+0

Prova questo forse: http://stackoverflow.com/questions/5123407/losing-data-when-rotate-screen – Zarwan

+0

Grazie, ma che mostra come salvare lo stato. So come salvare manualmente lo stato, ma vorrei sapere perché alcune viste (a volte!) Non salveranno automaticamente il loro stato. – SuperLemon

risposta

3

Se si guardano le TextView fonti (in particolare TextView#onSaveInstanceState()), si vedrà che il testo viene salvato solo in due casi :

  1. Quando l'utente ha chiesto esplicitamente di farlo impostando freezeText flag su true tramite android:freezesText="true" o TextView#setFreezesText(true)
  2. Quando il testo all'interno di TextView ha selezione.

Nel tuo caso, entrambi questi casi sono falsi, quindi il testo viene ripristinato allo stato predefinito durante il cambio di orientamento.

cambiamento semplice per il layout risolverà il problema:

<TextView 
    android:id="@+id/activity_main_textView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:freezesText="true" 
    android:maxLines="2" 
    android:text="test" 
    android:textSize="50sp" 
    /> 
+0

Grazie mille! C'è qualche differenza pratica tra il congelamento e il salvataggio e il ripristino manuale del testo? Inoltre, come mai nel mio esempio, lo stato viene salvato attraverso il primo cambio di orientamento e si ripristina solo dopo il secondo? Grazie ancora! – SuperLemon

+0

@SuperLemon Non penso che sia necessario reinventare la ruota per salvare manualmente lo stato, quindi vorrei usare ciò che è già disponibile. Per quanto riguarda il motivo per cui salva lo stato durante il primo cambio di orientamento - onestamente non lo so :) Ho creato un progetto di test con il layout e ho cercato di riprodurre questo comportamento - Perdo lo stato della textview durante il primo cambio di orientamento –