Jawaban:
Jika Anda ingin memaksa Anda TextView
untuk menyimpan statusnya, Anda harus menambahkan freezesText
atribut:
<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
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);
}
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
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>
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>
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.
tambahkan saja
android:configChanges="orientation|screenSize"
ke Aktivitas Anda di AndroidManifest.xml.
Saat konfigurasi berubah, Android memulai ulang aktivitas Anda secara default. Untuk mengubahnya, Anda harus mengganti onConfigurationChanged()
metode. Selain itu, Anda harus menambahkan android:configChanges
ke file manifes Anda.
Anda dapat membaca lebih lanjut di sini .
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.