Mengembalikan status TextView setelah rotasi layar?

104

Di aplikasi saya, saya memiliki TextViewdan EditText. Keduanya memiliki data di dalamnya. Ketika orientasi layar mengubah data di EditTextsisa - sisa, tetapi TextViewdata dihapus.

Dapatkah seseorang membantu saya menemukan cara untuk menyimpan data TextViewjuga?

kAnNaN
sumber

Jawaban:

221

Jika Anda ingin memaksa Anda TextViewuntuk menyimpan statusnya, Anda harus menambahkan freezesTextatribut:

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

Dari dokumentasi tentang freezesText:

Jika disetel, tampilan teks akan menyertakan teks lengkap saat ini di dalam es beku di samping meta-data seperti posisi kursor saat ini. Secara default ini dinonaktifkan; ini bisa berguna saat konten tampilan teks tidak disimpan di tempat yang persisten seperti penyedia konten

inazaruk
sumber
13
Mengapa teks 'dibekukan / disimpan' secara default seperti atribut lainnya (pemilihan teks, posisi kursor, dll.)? Dengan kata lain, dalam skenario apa seseorang sebenarnya lebih suka teks itu tidak disimpan?
Gautam
3
@Gautam Dugaan saya adalah sering kali TextView dibuat dari string statis yang disimpan dalam XML, dalam hal ini sistem akan mubazir untuk mengingat nilainya.
anderspitman
3
Sebenarnya, setelah Anda memberi ID EditText atau TextView, nilainya akan tetap ada selama acara rotasi layar.
DoctorFox
7
@jegesh - sayangnya ini tidak terjadi pada TextView setidaknya pada beberapa perangkat (Jellybean)
Bö macht Blau
1
Tidak bekerja untuk saya, setidaknya tidak pada perangkat API 17
Ab
28

Untuk mempertahankan data pada perubahan orientasi, Anda perlu mengimplementasikan dua metode:

@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
sumber
5
Mengapa menggunakan onRestoreInstanceState jika bundel yang sama tersedia di onCreate?
slott
4
@slott Periksa dokumentasi ini. developer.android.com/training/basics/activity-lifecycle/… Ini adalah dugaan tetapi saya menduga itu karena sistem melacak apakah itu membuat aktivitas baru, atau membuat yang lama. onRestorySavedInstance hanya dipanggil dalam keadaan yang lebih jarang - perubahan konfigurasi dan penghancuran aktivitas karena batasan memori.
Gusdor
6

1) Tidak semua tampilan dengan ID menyimpan statusnya. Widget Android, dengan ID, yang statusnya dapat diubah oleh pengguna, tampaknya menyimpan statusnya dengan cara mematikan. Jadi EditText menyimpan statusnya, tetapi TextView tidak menyimpan statusnya pada soft kill.

"AFAIK, Android hanya mengganggu status penyimpanan untuk hal-hal yang diharapkan berubah. Itulah mengapa ia menyimpan teks dalam EditText (yang kemungkinan besar akan diubah oleh pengguna) dan mungkin tidak menyimpan status untuk TextView (yang biasanya tetap statis ) "

Mark M

Jadi, Anda dapat memilih untuk menyimpan status textview di onSaveInstanceState dan Anda dapat memilih untuk memulihkan status textview di onCreate.

2) Praktik terbaiknya adalah menyimpan status instance non-tampilan "internal" meskipun Anda mendeklarasikan

android:configChanges= "orientation|keyboardHidden" 

Dari dokumen:

"Namun, aplikasi Anda harus selalu dapat mematikan dan memulai ulang dengan keadaan sebelumnya secara utuh. Bukan hanya karena ada perubahan konfigurasi lain yang tidak dapat Anda cegah untuk memulai ulang aplikasi Anda, tetapi juga untuk menangani peristiwa seperti saat pengguna menerima panggilan telepon dan kemudian kembali ke aplikasi Anda. "

JAL

JAL
sumber
6

Android tidak menangani hal semacam itu untuk Anda. Anda telah menyimpan semua data secara manual.

Anda dapat menggunakan dalam suatu aktivitas untuk menyimpan nilai

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

dan menggunakan sesuatu seperti ini dalam metode oncreate dari suatu aktivitas untuk memuat objek yang disimpan

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

Anda juga dapat memilih menonaktifkan perubahan orientasi untuk suatu aktivitas

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>
Kevin
sumber
tidak dapat mengganti onRetainNonConfigurationInstance () di android.support.v4.app.fragmentActivity; metode yang diganti adalah final !!
Akash Dubey
1

Ubah aktivitas Anda di AndroidManifest.xml untuk mengganti perilaku perubahan orientasi dengan menambahkan ini ke aktivitas / aktivitas Anda:

android:configChanges="orientation|keyboardHidden"

Ini akan terlihat seperti ini:

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>
Joakim Berglund
sumber
27
Secara umum, pendekatan ini tidak direkomendasikan oleh dokumentasi : "Menggunakan atribut ini harus dihindari dan hanya digunakan sebagai upaya terakhir. Harap baca Menangani Perubahan
Waktu Proses
1

Tambahkan ini ke AndroidManifest.xml
Letakkan Nama Aktivitas Anda di tempat Activity_Name

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

Ini akan bekerja dengan nilai yang mengubah TextField juga.

Rahul Krishna
sumber
1

tambahkan saja

android:configChanges="orientation|screenSize"

ke Aktivitas Anda di AndroidManifest.xml.

farhad.kargaran
sumber
-2

Saat konfigurasi berubah, Android memulai ulang aktivitas Anda secara default. Untuk mengubahnya, Anda harus mengganti onConfigurationChanged()metode. Selain itu, Anda harus menambahkan android:configChangeske file manifes Anda.

Anda dapat membaca lebih lanjut di sini .

Vladimir Ivanov
sumber
-7

Saya juga menggunakan

android:configChanges="orientation"

dan itu tidak berhasil.

Tapi kemudian saya menemukan solusi.

Verifikasi apakah Anda memiliki baris berikut dengan benar di maniest Anda:

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

pastikan itu tidak membaca sesuatu seperti

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

Saya mendapatkannya dengan cara kedua di tempat pertama tetapi ketika saya mengoreksinya, statusnya dipertahankan.

Optimus
sumber
1
Ini adalah hal yang sama sekali berbeda. Target SDK adalah membuat aplikasi Anda kompatibel dengan sebagian besar rentang OS Android. Ini bukan jawaban, dengan beberapa cara ini mungkin berhasil dalam kasus Anda tetapi ini bukan solusi yang tepat.
Rohan Kandwal