7

Co jest takiego specjalnego w Edittext, że może zachować wartość, ale nie Textview i kilka innych widżetów, a my musimy użyć metody onSavedInstance() dla nich.Jak EditText zachowuje swoją wartość, ale nie wyświetla tekstu, gdy zmienia się orientacja telefonu?

Jaka jest magia EditText, że może zachować wartości?

Jeśli ktoś może powiedzieć, jak to działa wewnętrznie.

< Aktualizacja ---- ---->

Jak to działa wewnętrznie, proszę zwrócić się do tej części kodu, który wyjaśnia ten scenariusz.

+0

czy ustawiasz wartość TextView za pomocą kodu? – Atrix1987

+0

Nie pytam, jak go zachować, ale jak to jest obsługiwane automatycznie przez Androida? –

+0

w rzeczywistości to będzie ... lub próbujesz powiedzieć coś jeszcze?/ – Kiran

Odpowiedz

5

Cytując z tego artykułu: http://tekeye.biz/2012/saving-activity-state

„Przełączanie urządzenia z pionowej na poziomą powoduje Android, aby zatrzymać i ponownie uruchomić aktywny, wspierającą działania możliwość odświeżenia ekranu dla różnych wymiarach Z zatrzymywania i uruchamiania działania. często użytkownicy byliby zirytowani, gdyby utracono dane wejściowe Android ma parę metod o nazwie onSaveInstanceState (Bundle) i onRestoreInstanceState (Bundle), które są używane przez widoki automatycznie do zapisywania ich danych. Te metody działają tylko wtedy, gdy Widoki z danymi mogą być zidentyfikowanym, stąd potrzeba, aby EditText miał identyfikator. Ta para metod może zostać nadpisana w działaniu, dzięki czemu zmienne stanu niezwiązane z polami wejściowymi również mogą zostać zapisane i odtworzone. "

Usuń identyfikator z EditText i spróbować :)

+0

Textview i edittext oba są początkowo mFreeze jako false. Ale Edittext utrzymuje stan. Ale Textview nie utrzymuje stanu. Jak to się dzieje? –

8

Czym jest magia za EditText specjalnie, że może zachować wartości ? Jak to działa wewnętrznie, Wskaż tę część kodu , która wyjaśnia ten scenariusz.

Jest to właściwość do wyboru, która wprowadza różnicę. Następujący stan if zajmuje się tym w TextView.onSaveInstanceState. Domyślnie TextView nie można wybrać. Stąd getSelectionStart() i getSelectionEnd() zwraca -1, tam przez save zmienna zawiera wartość false. Aby zachować go przy zmianie orientacji, ustaw wartość true dla atrybutu textIsSelectable.

Od EditText jest wybierana domyślnie getSelectionStart() i getSelectionEnd() zawsze zwraca wartość> = 0, tam save zmiennej posiada prawdziwą wartość i zawartość zostanie zapisana. Uwaga: Domyślnie freezesText jest wyłączony. Stąd wartość mFreezesText jest fałszywa.

+0

Czy możesz wyjaśnić, dlaczego 'getSelectionStart()' i 'getSelectionEnd()' zawsze zwracają wartość> = 0, gdy "textIsSelectable" jest prawdziwe? Mam na myśli, jeśli tekst jest do wyboru, ale nic nie jest zaznaczone, czy obie metody nie powinny zwracać -1? – curioustechizen

+0

@ curioustechizen Jeśli nie zaznaczono żadnego tekstu, początkiem i końcem zaznaczenia będzie 0, co oznacza, że ​​nie zaznaczono żadnego tekstu.Jest to to samo, co umieszczenie kursora w indeksie 0, jak w przypadku EditText. To jest [miejsce] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/android/text/method/ArrowKeyMovementMethod.java?av = f # 302), gdzie jest ustawiony na 0. –

+0

Hmm .. to jest mylące. Kod, z którym się łączyłeś, wydaje się przeczyć javadocs. W szczególności 'TextView # getSelectionStart()' wskazuje na 'android.text.Selection # getSelectionStart()'. I javadocs dla tego ostatniego stanu: 'Zwróć przesunięcie kotwicy wyboru lub kursora, lub -1, jeśli nie ma zaznaczenia lub kursora." – curioustechizen

3

Domyślnie widok EditText zapisuje swój stan - Wykonuje się to poprzez ustawienie flag w kodzie informującym widok, aby zapisać stan, gdy widok nie jest widoczny lub utracił ostrość. Tekst zostanie automatycznie zapisany i przywrócony po obróceniu urządzenia. Automatyczne zapisywanie stanu widzenia EditText można wyłączyć w pliku XML szablonu poprzez ustawienie androida: własność saveEnabled false:

android:saveEnabled="false" 

lub programowo, zadzwoń view.setSaveEnabled(false).

saveEnabled określa, czy zapisywanie stanu tego widoku jest włączone (to znaczy, czy zostanie wywołana jego metoda onSaveInstanceState()). Zauważ, że nawet jeśli włączone jest zamrażanie, widok nadal musi mieć przypisany identyfikator (za pomocą setId()), aby jego stan został zapisany. Ta flaga może wyłączyć zapisanie tego widoku; wszelkie widoki podrzędne mogą nadal mieć zapisany stan. Atrybut saveEnabled jest częścią Androida View - View Code. Części tutaj jest związane z kodem:

public boolean isSaveEnabled() { 
     return (mViewFlags & SAVE_DISABLED_MASK) != SAVE_DISABLED; 
    } 

...

public void setSaveEnabled(boolean enabled) { 
     setFlags(enabled ? 0 : SAVE_DISABLED, SAVE_DISABLED_MASK); 
    } 

...

void setFlags(int flags, int mask) { 
     int old = mViewFlags; 
     mViewFlags = (mViewFlags & ~mask) | (flags & mask); 

     int changed = mViewFlags^old; 
     if (changed == 0) { 
      return; 
     } 
     int privateFlags = mPrivateFlags; 

     /* Check if the FOCUSABLE bit has changed */ 
     if (((changed & FOCUSABLE_MASK) != 0) && 
       ((privateFlags & HAS_BOUNDS) !=0)) { 
      if (((old & FOCUSABLE_MASK) == FOCUSABLE) 
        && ((privateFlags & FOCUSED) != 0)) { 
       /* Give up focus if we are no longer focusable */ 
       clearFocus(); 
      } else if (((old & FOCUSABLE_MASK) == NOT_FOCUSABLE) 
        && ((privateFlags & FOCUSED) == 0)) { 
       /* 
       * Tell the view system that we are now available to take focus 
       * if no one else already has it. 
       */ 
       if (mParent != null) mParent.focusableViewAvailable(this); 
      } 
     } 

....

1

Wypróbuj za TextView myślę, może pomóc

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

Android Zobacz klasa zostały zabezpieczone metody

protected Parcelable onSaveInstanceState() 
protected void onRestoreInstanceState (Parcelable state) 

więc każdy widok mogą zastąpić te metody i Zapisz widok w informacji o stanie z nimi.

TextView rozszerza klasę widoku i posiada implementację chronionego obiektu Parcelable onSaveInstanceState() i chronionego obiektu onRestoreInstanceState (stan paczek) w tym obszarze.

pozwala spojrzeć na realizację onSaveInstanceState()

@Override 
public Parcelable onSaveInstanceState() 
{ 
    Parcelable superState = super.onSaveInstanceState(); 

    // Save state if we are forced to 
    boolean save = mFreezesText; 
    int start = 0; 
    int end = 0; 

    if (mText != null) 
    { 
     start = getSelectionStart(); 
     end = getSelectionEnd(); 
     if (start >= 0 || end >= 0) 
     { 
      // Or save state if there is a selection 
      save = true; 
     } 
    } 
    ... 
} 
  1. jak widać tutaj Zapisz funkcji zależy od pojedynczej flagi „Zapisz” więc jeśli użytkownik jawnie określić mFreezesText = true to uratuje tekst innej opcji, jeśli istnieje kursor wyboru, to przynajmniej zwróci getSelectionStart() = 0, a nie -1, co spowoduje, że TextView zrobi save = true, aby zapisać stan TextView i to, co dzieje się z EditText jako EditText ma Krzywe wyboru lub i rozszerza TextView.
Powiązane problemy