Wiederherstellen des Status von TextView nach Bildschirmdrehung?

104

In meiner App habe ich TextViewund EditText. Beide haben Daten. Wenn sich die Bildschirmausrichtung ändert, EditTextbleiben die Daten in den Überresten, aber die TextViewDaten werden gelöscht.

Kann mir jemand helfen, einen Weg zu finden, um auch Daten TextViewzu speichern ?

kAnNaN
quelle

Antworten:

220

Wenn Sie TextViewIhren Status erzwingen möchten, müssen Sie das folgende freezesTextAttribut hinzufügen :

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

Aus der Dokumentation zu freezesText:

Wenn diese Option aktiviert ist, enthält die Textansicht neben Metadaten wie der aktuellen Cursorposition auch den aktuellen vollständigen Text im eingefrorenen Eiszapfen. Standardmäßig ist dies deaktiviert. Dies kann nützlich sein, wenn der Inhalt einer Textansicht nicht an einem dauerhaften Ort wie einem Inhaltsanbieter gespeichert ist

inazaruk
quelle
13
Warum ist der Text nicht wie andere Attribute (Textauswahl, Cursorposition usw.) standardmäßig eingefroren / gespeichert? Mit anderen Worten, in welchem ​​Szenario würde jemand es tatsächlich vorziehen, dass der Text nicht gespeichert wird?
Gautam
3
@Gautam Ich vermute, dass TextViews häufig aus statischen Zeichenfolgen erstellt werden, die in XML gespeichert sind. In diesem Fall ist es für das System überflüssig, sich die Werte zu merken.
anderspitman
3
Sobald Sie dem EditText oder der Textansicht eine ID geben, bleibt der Wert während eines Bildschirmrotationsereignisses bestehen.
DoctorFox
7
@jegesh - leider ist dies nicht der Fall für TextViews zumindest auf einigen Geräten (Jellybean)
Bö macht Blau
1
Nicht für mich arbeiten, zumindest nicht auf eine API - 17 - Gerät
Ab
28

Um Daten zur Orientierungsänderung beizubehalten, müssen Sie die beiden Methoden implementieren:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}
Eric Nordvik
quelle
5
Warum onRestoreInstanceState verwenden, wenn dasselbe Bundle in onCreate verfügbar ist?
Slott
4
@slott Überprüfen Sie diese Dokumentation. developer.android.com/training/basics/activity-lifecycle/… Dies ist eine Vermutung, aber ich vermute, dass das System verfolgt, ob es eine neue Aktivität erstellt oder eine alte neu erstellt. onRestorySavedInstance wird nur in selteneren Fällen aufgerufen - Konfigurationsänderungen und Zerstörung der Aktivität aufgrund von Speicherbeschränkungen.
Gusdor
6

1) Nicht alle Ansichten mit einer ID speichern ihren Status. Android-Widgets mit einer ID, deren Status vom Benutzer geändert werden kann, scheinen ihren Status bei einem Soft-Kill zu speichern. EditText speichert also seinen Status, TextView speichert seinen Status jedoch nicht bei einem Soft-Kill.

"AFAIK, Android stört das Speichern des Status nur für Dinge, von denen erwartet wird, dass sie sich ändern. Aus diesem Grund speichert es den Text in einem EditText (den ein Benutzer wahrscheinlich ändert) und speichert den Status möglicherweise nicht für eine TextView (die normalerweise statisch bleibt) ) "

Mark M.

Sie können also den Status der Textansicht in onSaveInstanceState speichern und den Status der Textansicht in onCreate wiederherstellen.

2) Es wird empfohlen, den "internen" Instanzstatus ohne Ansicht zu speichern, auch wenn Sie dies deklarieren

android:configChanges= "orientation|keyboardHidden" 

Aus den Dokumenten:

"Ihre Anwendung sollte jedoch immer in der Lage sein, mit ihrem vorherigen Status herunterzufahren und neu zu starten. Nicht nur, weil es andere Konfigurationsänderungen gibt, die Sie nicht daran hindern können, Ihre Anwendung neu zu starten, sondern auch, um Ereignisse zu behandeln, z. B. wenn der Benutzer einen eingehenden Empfang erhält Telefonanruf und kehrt dann zu Ihrer Anwendung zurück. "

JAL

JAL
quelle
6

Android erledigt solche Dinge nicht für Sie. Sie haben alle Daten manuell gespeichert.

Sie können in einer Aktivität Werte speichern

@Override
    public Object onRetainNonConfigurationInstance() {
        HashMap<String, Object> savedValues = new HashMap<String, Object>();
        savedValues.put("someKey", someData);           
        return savedValues;
    }

und verwenden Sie so etwas in der oncreate-Methode einer Aktivität, um die gespeicherten Objekte zu laden

HashMap < String, Object> savedValues 
     = (HashMap<String, Object>)this.getLastNonConfigurationInstance();

Sie können auch die Deaktivierung der Orientierungsänderung für eine Aktivität auswählen

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>
Kevin
quelle
onRetainNonConfigurationInstance () in android.support.v4.app.fragmentActivity kann nicht überschrieben werden; überschriebene Methode ist endgültig !!
Akash Dubey
1

Ändern Sie Ihre Aktivitäten in AndroidManifest.xml, um das Verhalten bei Orientierungsänderungen zu überschreiben, indem Sie dies zu Ihrer Aktivität / Ihren Aktivitäten hinzufügen:

android:configChanges="orientation|keyboardHidden"

Es sollte ungefähr so ​​aussehen:

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>
Joakim Berglund
quelle
27
Im Allgemeinen wird dieser Ansatz in der Dokumentation nicht empfohlen : "Die Verwendung dieses Attributs sollte vermieden und nur als letzter Ausweg verwendet werden. Bitte lesen Sie Handling Runtime Changes ..."
idbrii
1

Fügen Sie diese zu AndroidManifest.xml hinzu. Geben
Sie Ihren Aktivitätsnamen an die Stelle von Aktivitätsname

<activity android:name="Activity_Name"
        android:screenOrientation="sensor"
        ...
        android:configChanges="orientation|keyboardHidden|screenSize">

Dies funktioniert auch mit der Wertänderung von TextField.

Rahul Krishna
quelle
1

einfach hinzufügen

android:configChanges="orientation|screenSize"

zu Ihrer Aktivität in AndroidManifest.xml.

farhad.kargaran
quelle
-2

Wenn sich die Konfiguration ändert, startet Android Ihre Aktivität standardmäßig neu. Um dies zu ändern, sollten Sie die onConfigurationChanged()Methode überschreiben . Außerdem sollten Sie hinzufügenandroid:configChanges Ihrer Manifestdatei .

Sie können mehr lesen hier .

Vladimir Ivanov
quelle
-7

Ich habe auch verwendet

android:configChanges="orientation"

und es hat nicht funktioniert.

Aber dann habe ich eine Lösung gefunden.

Überprüfen Sie, ob Sie die folgende Zeile korrekt in Ihrem männlichsten haben:

<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />

Stellen Sie sicher, dass es nicht so etwas liest

<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`

Ich hatte es auf die zweite Art und Weise, aber als ich es korrigierte, blieb der Zustand erhalten.

Optimus
quelle
1
Das ist eine ganz andere Sache. Ziel des SDK ist es, Ihre App mit den meisten Android-Betriebssystemen kompatibel zu machen. Dies ist keine Antwort. In Ihrem Fall hat dies möglicherweise funktioniert, aber dies ist keine geeignete Lösung.
Rohan Kandwal