Wie EditText seinen Wert behält, aber nicht Textansicht, wenn sich die Telefonorientierung ändert?

Was ist das Besondere an Edittext, dass es den Wert behalten kann, aber nicht Textview und einige andere Widgets und wir müssen die onSavedInstance () – Methode für sie verwenden.

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

Wenn jemand sagen kann, wie es intern funktioniert.

<—- Update —->

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

  • So ermitteln Sie die Anzahl der Zeilen, die in TextView sichtbar sind?
  • Wie kann ich Farbverlaufseffekt der Hintergrundfarbe von TextView in einer ListView hinzufügen?
  • Bearbeitbare Textansicht bei Klick
  • Android Layout - Layoutgewicht und Weightsum
  • Wie man die kontextbezogene Aktionsleiste für die Textansicht programmgesteuert mit der Voreinstellung beginnt, kopiere und wähle alle aus?
  • Beim Aufruf von TextView.setText () wird der gesamte Bildschirm trotz der Ansichtshierarchie neu gezeichnet
  • Wie man die Richtung des Festzeltes eines TextViews umkehrt
  • Aufteilen von Text über mehrere TextViews / Fragmente mit ViewPager
  • 5 Solutions collect form web for “Wie EditText seinen Wert behält, aber nicht Textansicht, wenn sich die Telefonorientierung ändert?”

    Was ist die Magie hinter EditText speziell, dass es die Werte behalten kann? Wie es intern funktioniert, bitte auf den Teil des Codes, der dieses Szenario erklärt.

    Es ist die wählbare Eigenschaft, die den Unterschied bringt. Die folgende, if Bedingung 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 kann TextView nicht ausgewählt werden. Also getSelectionStart() und getSelectionEnd() gibt -1 , da die save Variable einen falschen Wert enthält. Um es zu behalten, ist der Inhalt der Orientierungsänderung, setzen Sie das Attribut textIsSelectable auf true.

    Da EditText standardmäßig wählbar ist, gibt getSelectionStart() und getSelectionEnd() immer den Wert> = 0, da save Variable " save Variable" den wahren Wert hat und der Inhalt gespeichert wird.

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

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

    "Das Umschalten des Geräts von Portrait zu Landschaft veranlasst Android, um die Aktivität zu stoppen und neu zu starten, so dass Aktivitäten die Möglichkeit haben, einen Bildschirm für die verschiedenen Dimensionen neu zu zeichnen.Mit dem Stoppen und Starten einer Aktivität ein häufiges Auftreten Benutzer würden verärgert werden, wenn Eingang verloren geht Haben ein paar Methoden namens onSaveInstanceState (Bundle) und onRestoreInstanceState (Bundle), die von Views verwendet werden, um ihre Daten automatisch zu speichern. Diese Methoden funktionieren nur, wenn die Ansichten mit Daten identifiziert werden können, daher die Notwendigkeit für die EditText, eine ID zu haben. Dieses Methodenpaar kann in einer Aktivität überschrieben werden, damit auch Zustandsvariablen, die nicht mit Eingabefeldern verknüpft sind, gespeichert und wiederhergestellt werden können. "

    Entfernen Sie die ID aus einem Edittext und probieren Sie es aus 🙂

    Standardmäßig speichert EditText-Ansicht seinen Zustand – Dies geschieht durch das Setzen von Flags im Code, um die Ansicht zu markieren, um den Status zu speichern, wenn die Ansicht nicht sichtbar ist oder den Fokus verloren hat. Der Text wird nach dem Drehen des Gerätes automatisch gespeichert und wiederhergestellt. Das automatische Speichern des Zustands der EditText-Ansicht kann in der XML-Layout-Datei deaktiviert werden, indem die android: saveEnabled-Eigenschaft auf false gesetzt wird:

      android:saveEnabled="false" 

    Oder programmgesteuert rufen Sie view.setSaveEnabled(false) .

    SaveEnabled steuert, ob das Speichern des Status dieser Ansicht aktiviert ist (dh, ob die Methode onSaveInstanceState () aufgerufen wird). Beachten Sie, dass die Ansicht, auch wenn das Einfrieren aktiviert ist, der ID noch eine ID zugewiesen werden muss (über setId ()) für den zu speichernden Zustand. Dieses Flag kann nur das Speichern dieser Ansicht deaktivieren. Alle Kindersichten können ihren Zustand noch gespeichert haben. SaveEnabled Attribut ist Teil von android View – View Code . Hier sind verwandte 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); } } 

    ….

    Versuchen Sie dies für Ihre Textansicht Ich denke, es kann Ihnen helfen

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

    Android View-Klasse haben geschützte Methoden

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

    So kann jede Ansicht diese Methoden überschreiben und die Statusinformationen von View mit ihnen speichern.

    TextView erweitert die Ansichtsklasse und hat die Implementierung von geschützten Parcelable onSaveInstanceState () und geschützten void onRestoreInstanceState (Parcelable state) darin.

    Lasst uns auf die Implementierung von 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. Wie Sie hier sehen können speichern Feature ist abhängig von Single-Flag "speichern" so, wenn Benutzer explizit spezifizieren mFreezesText = true dann wird es den Text speichern
    2. Eine andere Möglichkeit, wenn es Selektionscursor gibt, dann wird es zumindest RückgabewertStart () = 0 und nicht -1, was dazu führt, dass TextView save = true macht, um den Zustand von TextView zu speichern und das ist, was mit EditText als EditText passiert hat, haben einen Cursor und es tut Erweitert TextView.
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.