Saya tidak perlu mengubah apa pun saat layar diputar. Aplikasi saya menampilkan gambar acak ketika pertama kali memuat dan memutar perangkat tidak boleh memilih gambar acak lain. Bagaimana saya dapat (secara sederhana) menghentikan perilaku ini?
Saya tidak perlu mengubah apa pun saat layar diputar. Aplikasi saya menampilkan gambar acak ketika pertama kali memuat dan memutar perangkat tidak boleh memilih gambar acak lain. Bagaimana saya dapat (secara sederhana) menghentikan perilaku ini?
Jawaban:
Secara umum ada tiga cara untuk melakukan ini:
Seperti yang disarankan beberapa jawaban, Anda dapat membedakan kasus aktivitas yang dibuat untuk pertama kalinya dan dipulihkan savedInstanceState. Ini dilakukan dengan onSaveInstanceStatemengganti dan memeriksa parameter onCreate.
Anda dapat mengunci aktivitas dalam satu orientasi dengan menambahkan android:screenOrientation="portrait"(atau "landscape") ke <activity>dalam manifes Anda.
Anda bisa mengatakan sistem yang dimaksudkan untuk menangani perubahan layar untuk diri sendiri dengan menentukan android:configChanges="orientation|screenSize"di <activity>tag. Dengan cara ini aktivitas tidak akan dibuat ulang, tetapi akan menerima panggilan balik (yang dapat Anda abaikan karena tidak berguna untuk Anda).
Secara pribadi saya akan pergi dengan (3). Tentu saja jika mengunci aplikasi ke salah satu orientasi baik-baik saja dengan Anda, Anda juga dapat pergi dengan (2).
android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"bekerja untukku. Terima kasih @Pacerier
android:configChanges="orientation|screenSize" nilai untuk API> = 13, karena banyak orang melihat jawaban Anda sebagai yang utama!
Jawaban Xion sudah dekat, tetapi # 3 ( android:configChanes="orientation") tidak akan berfungsi kecuali aplikasi memiliki tingkat API 12 atau lebih rendah.
Di API level 13 atau lebih, ukuran layar berubah ketika orientasi berubah, jadi ini masih menyebabkan aktivitas dihancurkan dan dimulai ketika orientasi berubah.
Cukup tambahkan atribut "screenSize" seperti yang saya lakukan di bawah ini:
<activity
android:name=".YourActivityName"
android:configChanges="orientation|screenSize">
</activity>
Sekarang, ketika Anda mengubah orientasi (dan ukuran layar berubah), aktivitas mempertahankan statusnya dan onConfigurationChanged()dipanggil. Ini akan menjaga apa pun yang ada di layar (yaitu: halaman web di tampilan Web) ketika orientasi berubah.
Pelajari ini dari situs ini: http://developer.android.com/guide/topics/manifest/activity-element.html
Juga, ini tampaknya praktik yang buruk jadi baca tautan di bawah ini tentang Menangani Perubahan Waktu Runtime:
http://developer.android.com/guide/topics/resources/runtime-changes.html
android:configChanges="orientation|screenSize"
Anda hanya perlu pergi ke bagian AndroidManifest.xmldalam dan di dalam label aktivitas Anda, Anda harus mengetikkan baris kode ini sebagai seseorang di sana berkata:
android:configChanges="orientation|screenSize"
Jadi, Anda akan memiliki sesuatu seperti ini:
<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>
Semoga berhasil!
<activity android:name="com.example.abc"
android:configChanges="orientation|screenSize"></activity>
Cukup tambahkan android:configChanges="orientation|screenSize" di tab aktivitas file manifes.
Jadi, Aktivitas tidak akan dimulai kembali ketika orientasi berubah.
onSaveInstanceState()dan onCreate().
Ini pengalaman saya bahwa sebenarnya lebih baik hanya berurusan dengan perubahan orientasi dengan benar daripada mencoba untuk menunjukkan perilaku yang tidak standar.
Anda harus menyimpan gambar yang sedang ditampilkan onSaveInstanceState()dan mengembalikannya dengan benar ketika aplikasi Anda berjalan onCreate()lagi.
android:configChangesharus dihindari dan digunakan hanya sebagai pilihan terakhir. Harap baca Menangani Perubahan Waktu Runtime untuk informasi lebih lanjut tentang cara menangani restart dengan benar karena perubahan konfigurasi."
Solusi ini sejauh ini merupakan solusi terbaik. Dalam file manifes Anda tambahkan
<activity
android:configChanges="keyboardHidden|orientation|screenSize"
android:name="your activity name"
android:label="@string/app_name"
android:screenOrientation="landscape">
</activity
Dan di kelas aktivitas Anda tambahkan kode berikut
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//your code
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//your code
}
}
tambahkan android:configChanges="keyboardHidden|orientation|screenSize"untuk semua tag aktivitas aplikasi dalam manifes.
Tambahkan saja ini ke AndroidManifest.xml
<activity android:screenOrientation="landscape">
Maksud saya, ada tag aktivitas, tambahkan ini sebagai parameter lain. Jika Anda membutuhkan orientasi potret, ubah lanskap menjadi potret. Semoga ini membantu.
Dalam file manifiest tambahkan ke setiap aktivitas ini. Ini akan membantu
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
Semua jawaban di atas tidak berfungsi untuk saya. Jadi, saya telah tetap dengan menyebutkan labeldengan screenOrientationseperti di bawah ini. Sekarang semuanya baik-baik saja
<activity android:name=".activity.VideoWebViewActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize"/>
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
Simpan detail gambar di Anda onPause()atau onStop()dan gunakan di onCreate(Bundle savedInstanceState)untuk memulihkan gambar.
EDIT:
Info lebih lanjut tentang proses sebenarnya dirinci di sini http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle karena berbeda di Honeycomb daripada versi Android sebelumnya.
cukup gunakan: android:configChanges="keyboardHidden|orientation"
Seperti yang disebutkan Pacerier,
android:configChanges="orientation|screenSize"
Saya tidak tahu apakah solusi yang terbaik, tetapi saya jelaskan di sini:
Pertama-tama, Anda perlu sertifikat dengan kelas Anda. Aplikasi aplikasi Anda ada dalam manifes ini:
<application
android:name=".App"
...
Kedua, di App kelas saya saya suka ini:
public class App extends Application {
public static boolean isOrientationChanged = false;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onConfigurationChanged(@NotNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
isOrientationChanged = true;
}
}
}
Ketiga, Anda perlu mengatur bendera ke Perubahan Orientasi, dalam kasus saya, saya selalu mengaturnya ketika aktivitas sebelumnya dalam navigasi aplikasi dipanggil, jadi hanya memanggil satu kali ketika aktivitas nanti dibuat.
isOrientationChanged = false;
Jadi setiap kali saya mengubah orientasi layar saya dalam konteks itu, saya mengaturnya setiap kali mengubah pengaturan ini, memeriksa apakah ada perubahan orientasi, jika demikian, itu memvalidasi berdasarkan nilai dari bendera itu.
Pada dasarnya, saya harus menggunakannya setiap kali saya membuat permintaan retrofit asinkron, yang disebutnya setiap saat yang mengubah orientasi, terus-menerus menabrak aplikasi:
if (!isOrientationChanged) {
presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}
Saya tidak tahu apakah itu solusi yang paling elegan dan indah, tapi setidaknya ini fungsional :)
Tambahkan kode ini setelah onCreatemetode, dalam aktivitas Anda yang berisiWebView
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
Screen.lockOrientation(this)dari github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/… untuk ini. Ini memungkinkan membuka kunci yang manifes tidak.