7

Was Edittext so besonders macht, dass es den Wert behalten kann, aber nicht Textview und einige andere Widgets, und wir müssen die onSavedInstance() Methode für sie verwenden.Wie EditText behält seinen Wert, aber nicht Textansicht, wenn sich die Telefonausrichtung ändert?

Was ist die Magie hinter EditText speziell, dass es die Werte beibehalten kann?

Wenn jemand kann sagen, wie es intern funktioniert.

< ---- aktualisieren ---->

So funktioniert es intern, weisen Sie bitte auf den Teil des Codes, der dieses Szenario erklärt.

+0

Setzen Sie den Wert der TextView über Code? – Atrix1987

+0

Ich frage nicht, wie man es behält, aber wie es automatisch von Android gehandhabt wird? –

+0

eigentlich wird es ... oder Sie versuchen, etwas anderes zu sagen?/ – Kiran

Antwort

5

aus diesem Artikel Zitiert: http://tekeye.biz/2012/saving-activity-state

„von Hoch- auf Querformat das Gerät Schalt verursacht Android, um die Aktivität zu stoppen und neu zu starten, so dass Aktivitäten die Möglichkeit, einen Bildschirm für die verschiedenen Dimensionen neu zu zeichnen, mit dem Stoppen und Starten eine Aktion. Ein häufiges Vorkommen von Benutzern wäre ärgerlich, wenn die Eingabe verloren ging. Android hat ein Paar Methoden onSaveInstanceState (Bundle) und onRestoreInstanceState (Bundle), die von Views automatisch verwendet werden, um ihre Daten zu speichern.Diese Methoden funktionieren nur, wenn die Views with data Identifiziert werden, daher muss der EditText eine ID haben.Dieses Methodenpaar kann in einer Aktivität überschrieben werden, so dass Zustandsvariablen, die nicht mit Eingabefeldern verknüpft sind, ebenfalls gespeichert und wiederhergestellt werden können. "

die ID von einem EditText entfernen und versuchen, es

+0

Textview und edittext beide sind zunächst mFreeze als false. Edittext behält jedoch den Status bei. Aber Textview nicht den Zustand beibehalten. Wie das passiert ??? –

8

Was :) ist die Magie hinter EditText speziell, dass sie die Werte beibehalten können? Wie es intern funktioniert, bitte zeigen Sie auf den Teil des Codes , der dieses Szenario erklärt.

Es ist die wählbare Eigenschaft, die den Unterschied bringt. Der folgende if Zustand in TextView.onSaveInstanceState kümmert sich darum.

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

    ... 
} 

standardmäßig TextView nicht ausgewählt werden können. Daher getSelectionStart() und getSelectionEnd() gibt -1 zurück, da durch save Variable false Wert hält. Um den Inhalt bei einer Orientierungsänderung beizubehalten, setzen Sie das Attribut textIsSelectable auf True.

Da EditText standardmäßig wählbar ist, getSelectionStart() und getSelectionEnd() immer Wert zurück> = 0, da durch save Variable enthält wahren Wert und der Inhalt gespeichert wird.

Hinweis: Standardmäßig ist freezesText deaktiviert. Daher mFreezesText Wert ist falsch.

+0

Können Sie erklären, warum 'getSelectionStart()' und 'getSelectionEnd()' immer den Wert> = 0 zurückliefern, wenn 'textIsSelectable' wahr ist? Ich meine, wenn Text auswählbar ist, aber nichts ausgewählt ist, sollten beide Methoden nicht -1 zurückgeben? – curioustechizen

+0

@curioustechizen Wenn kein Text ausgewählt ist, ist der Anfang und das Ende der Auswahl 0, was bedeutet, dass kein Text ausgewählt wurde.Es ist dasselbe wie das Setzen eines Cursors auf den 0. Index, wie im Fall von EditText. Dies ist der [Ort] (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) wo es auf 0 gesetzt ist. –

+0

Hmm .. das ist verwirrend. Der Code, den Sie verlinkt haben, scheint den Javadocs zu widersprechen. Insbesondere zeigt 'TextView # getSelectionStart()' auf 'android.text.Selection # getSelectionStart()'. Und die Javadocs für den letzteren Zustand: 'Den Offset des Auswahlankers oder -cursors zurückgeben, oder -1, wenn es keine Auswahl oder keinen Cursor gibt. – curioustechizen

3

Standardmäßig speichert die EditText-Ansicht ihren Status. Dies wird durch Setzen von Flags im Code erreicht, die der Ansicht mitteilen, dass der Status gespeichert werden soll, wenn die Ansicht nicht sichtbar ist oder der Fokus verloren gegangen ist. Der Text wird nach dem Drehen des Geräts automatisch gespeichert und wiederhergestellt. saveEnabled Eigenschaft auf false:

android:saveEnabled="false" 

oder programmatisch, ruft view.setSaveEnabled(false) Die automatische Speicherung von Zustand EditText Ansicht kann durch Setzen des Android im XML-Layout-Datei deaktiviert werden.

saveEnabled steuert, ob das Speichern des Status dieser Ansicht aktiviert ist (dh ob die onSaveInstanceState() -Methode aufgerufen wird). Beachten Sie, dass selbst wenn das Einfrieren aktiviert ist, der Ansicht immer noch eine ID zugewiesen sein muss (über setId()), damit der Status gespeichert wird. Dieses Flag kann nur das Speichern dieser Ansicht deaktivieren. Bei allen untergeordneten Ansichten kann der Status noch gespeichert werden. saveEnabled-Attribut ist Teil von Android View - View Code. Hier bezieht sich Teile des Codes:

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

Versuchen Sie dies für Ihre Textview ich denke, es kann Ihnen helfen

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

Android View-Klasse haben Methoden

geschützt
protected Parcelable onSaveInstanceState() 
protected void onRestoreInstanceState (Parcelable state) 

so kann jede Ansicht diese Methoden außer Kraft setzen und mit ihnen nach Ansicht der Zustandsinformationen speichern.

TextView erweitert die View-Klasse und verfügt über die Implementierung des geschützten Parcelable onSaveInstanceState() und des geschützten void onRestoreInstanceState (Parcelable state).

können bei der Implementierung von onSaveInstanceState aussehen()

@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. wie Sie speichern Feature sehen hier auf einzelne Flagge "save" so, wenn der Benutzer explizit angeben mFreezesText = true, dann wird es speichern abhängig Der Text
  2. eine weitere Möglichkeit, wenn es Auswahl-Cursor gibt dann zumindest getSelectionStart() = 0 und nicht -1, die TextView zu machen, speichern = True, um Status von TextView zu speichern und das ist was passiert mit EditText als EditText haben Auswahl curs oder und es erweitert TextView.
Verwandte Themen