画面回転後にTextViewの状態を復元しますか?


104

私のアプリにはとがTextViewありEditTextます。どちらにもデータがあります。画面の向きが変わるとデータはEditText残りTextViewますが、データはクリアされます。

誰かが私TextViewもデータを保持する方法を見つけるのを手伝ってくれる?

回答:


221

強制的にTextViewその状態を保存したい場合は、freezesText属性を追加する必要があります。

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

のドキュメントからfreezesText

設定されている場合、テキストビューには、現在のカーソル位置などのメタデータに加えて、凍結されたつららの内部に現在の完全なテキストが含まれます。デフォルトでは無効になっています。テキストビューのコンテンツがコンテンツプロバイダーなどの永続的な場所に保存されていない場合に役立ちます。


13
テキストが他の属性(テキストの選択、カーソルの位置など)のようにデフォルトで「フリーズ/保存」されないのはなぜですか?言い換えると、テキストが保存されないことを実際に好むのはどのようなシナリオですか?
ゴータム2013年

3
@Gautam私の推測では、TextViewは多くの場合、XMLに格納された静的文字列から構築されると考えられます。その場合、システムが値を記憶するのは冗長です。
アンデルスピットマン2014

3
実際、EditTextまたはTextViewにIDを指定すると、画面回転イベントの間、値が持続します。
DoctorFox

7
@jegesh -残念ながら、これは、少なくともいくつかのデバイス(Jellybean)にTextViewsには当てはまらない
BOはブラウマクト

1
少なくともないAPI 17デバイス上で、私のために動作しません
Abの

28

方向変更に関するデータを保持するには、次の2つの方法を実装する必要があります。

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

5
同じバンドルがonCreateで使用できるのに、なぜonRestoreInstanceStateを使用するのですか?
スロット

4
@slottこのドキュメントを確認してください。developer.android.com/training/basics/activity-lifecycle/…これは推測ですが、システムが新しいアクティビティを作成しているか、古いアクティビティを再作成しているかを追跡しているためと考えられます。onRestorySavedInstanceは、まれな状況でのみ呼び出されます-メモリの制限による構成の変更とアクティビティの破棄。
Gusdor

6

1)IDを持つすべてのビューがその状態を保存するわけではありません。ユーザーが状態を変更できるIDのAndroidウィジェットは、ソフトキルで状態を保存するように見えます。したがって、EditTextはその状態を保存しますが、TextViewはソフトキルでその状態を保存しません。

「AFAIK、Androidは変更が予想されるものの状態を保存することのみを気にします。そのため、テキストはEditText(ユーザーが変更する可能性が高い)に保存され、おそらくTextView(通常は静的なまま)の状態を保存しません。 )」

マークM

したがって、onSaveInstanceStateでテキストビューの状態を保存することを選択し、onCreateでテキストビューの状態を復元することを選択できます。

2)ベストプラクティスは、宣言した場合でも「内部」の非ビューインスタンスの状態を保存することです。

android:configChanges= "orientation|keyboardHidden" 

ドキュメントから:

「しかし、アプリケーションは常にシャットダウンし、以前の状態をそのままにして再起動できる必要があります。アプリケーションの再起動を妨げることができない他の構成変更があるためだけでなく、ユーザーが着信を受信したときなどのイベントを処理するためにも電話してからアプリケーションに戻ります。」

JAL


6

Androidはそのようなものを処理しません。すべてのデータを手動で保存しました。

アクティビティで使用して値を保存できます

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

そして、アクティビティのoncreateメソッドでこのようなものを使用して、保存されたオブジェクトをロードします

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

アクティビティの向きの変更を無効にすることもできます

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

android.support.v4.app.fragmentActivityでonRetainNonConfigurationInstance()をオーバーライドすることはできません;オーバーライドされたメソッドは最終です!!
Akash Dubey

1

AndroidManifest.xmlでアクティビティを変更して、向きを変更する動作をオーバーライドします。これをアクティビティに追加します。

android:configChanges="orientation|keyboardHidden"

次のようになります。

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>

27
一般に、このアプローチはドキュメントでは推奨されていません。「この属性の使用は避け、最後の手段としてのみ使用してください。ランタイムの変更の処理を読んでください...」
idbrii

1

これらをAndroidManifest.xmlに追加し
ます。Activity_Name の場所にアクティビティ名を入力します

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

これは、TextFieldを変更する値でも機能します。


1

追加するだけ

android:configChanges="orientation|screenSize"

AndroidManifest.xmlのアクティビティに追加します。


-2

設定を変更すると、Androidはデフォルトでアクティビティを再開します。これを変更するには、onConfigurationChanged()メソッドをオーバーライドする必要があります。また、追加する必要がありますandroid:configChangesマニフェストファイルにするます。

詳しくはこちらをご覧ください


-7

私も使った

android:configChanges="orientation"

そしてそれはうまくいきませんでした。

しかし、私は解決策を見つけました。

次の行がマニフェストに正しくあるかどうかを確認します。

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

のようなものを読んでいないことを確認してください

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

最初は2番目の方法でしたが、修正すると状態が保持されました。


1
これはまったく別のものです。ターゲットSDKは、アプリをほとんどの範囲のAndroid OSと互換性を持つようにすることです。これは答えではありません。ある意味、これはあなたのケースではうまくいったかもしれませんが、これは適切な解決策ではありません。
Rohan Kandwal 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.