Pertanyaan Aktivitas dimulai kembali pada Android rotasi


Dalam aplikasi Android saya, ketika saya memutar perangkat (geser keluar keyboard) maka saya Activity dimulai kembali (onCreate disebut). Sekarang, ini mungkin bagaimana seharusnya, tapi saya melakukan banyak pengaturan awal di onCreate metode, jadi saya perlu:

  1. Taruh semua pengaturan awal di fungsi lain sehingga tidak semua hilang pada rotasi perangkat atau
  2. Jadikan demikian onCreate tidak dipanggil lagi dan tata letak hanya menyesuaikan atau
  3. Batasi aplikasi hanya untuk potret saja onCreate tidak disebut.

1222
2018-01-19 00:28


asal


Jawaban:


Menggunakan Kelas Aplikasi

Tergantung pada apa yang Anda lakukan dalam inisialisasi Anda, Anda dapat mempertimbangkan untuk membuat kelas baru yang diperluas Application dan memindahkan kode inisialisasi Anda ke dalam override onCreate metode dalam kelas itu.

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

Itu onCreate di kelas aplikasi hanya dipanggil ketika seluruh aplikasi dibuat, sehingga Aktivitas dimulai kembali pada orientasi atau perubahan visibilitas keyboard tidak akan memicu.

Ini adalah praktik yang baik untuk mengekspos instance kelas ini sebagai tunggal dan mengekspos variabel aplikasi yang Anda inisialisasi menggunakan getter dan setter.

CATATAN: Anda harus menentukan nama kelas Aplikasi baru Anda di manifes agar dapat didaftarkan dan digunakan:

<application
    android:name="com.you.yourapp.MyApplicationClass"

Bereaksi terhadap Perubahan Konfigurasi  [PEMBARUAN: ini sudah tidak berlaku lagi sejak API 13; lihat alternatif yang disarankan]

Sebagai alternatif lebih lanjut, Anda dapat memiliki aplikasi Anda mendengarkan acara yang akan menyebabkan restart - seperti orientasi dan perubahan visibilitas keyboard - dan menanganinya dalam Aktivitas Anda.

Mulai dengan menambahkan android:configChanges simpul ke simpul manifes Aktivitas Anda

android:configChanges="keyboardHidden|orientation"

atau untuk Android 3.2 (API level 13) dan yang lebih baru:

android:configChanges="keyboardHidden|orientation|screenSize"

Kemudian dalam Kegiatan itu menimpa onConfigurationChanged metode dan panggilan setContentView untuk memaksa tata letak GUI untuk dilakukan kembali dalam orientasi baru.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}

896
2018-01-19 08:47



Pembaruan untuk Android 3.2 dan lebih tinggi:

Peringatan: Dimulai dengan Android 3.2 (API level 13), "ukuran layar" juga berubah saat perangkat beralih antara orientasi potret dan lanskap. Jadi, jika Anda ingin mencegah runtime restart karena perubahan orientasi ketika mengembangkan untuk API level 13 atau lebih tinggi (seperti yang dinyatakan oleh atribut minSdkVersion dan targetSdkVersion), Anda harus menyertakan "screenSize" nilai selain "orientation" nilai. Artinya, Anda harus menyatakan android:configChanges="orientation|screenSize". Namun, jika aplikasi Anda menargetkan API level 12 atau lebih rendah, maka aktivitas Anda selalu menangani perubahan konfigurasi ini sendiri (perubahan konfigurasi ini tidak memulai ulang aktivitas Anda, bahkan saat berjalan di perangkat Android 3.2 atau lebih tinggi).


175
2018-03-03 21:56



Alih-alih mencoba menghentikan onCreate() dari dipecat sama sekali, mungkin mencoba memeriksa Bundle  savedInstanceState dilewatkan ke acara untuk melihat apakah itu tidak valid atau tidak.

Sebagai contoh, jika saya memiliki logika yang harus dijalankan ketika Activity benar - benar dibuat, tidak pada setiap orientasi berubah, saya hanya menjalankan logika itu di onCreate()hanya jika savedInstanceState adalah null.

Jika tidak, saya masih ingin tata letak untuk menggambar ulang dengan benar untuk orientasi.

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

tidak yakin apakah ini adalah jawaban akhir, tetapi ini berhasil untuk saya.


110
2017-08-04 21:04



apa yang saya lakukan...

di manifes, ke bagian aktivitas, ditambahkan:

android:configChanges="keyboardHidden|orientation"

dalam kode untuk aktivitas, diimplementasikan:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}

93
2018-01-04 01:26



Apa yang Anda gambarkan adalah perilaku default. Anda harus mendeteksi dan menangani acara ini sendiri dengan menambahkan:

android:configChanges

ke manifes Anda dan kemudian perubahan yang ingin Anda tangani. Jadi untuk orientasi, Anda akan menggunakan:

android:configChanges="orientation"

dan untuk keyboard yang dibuka atau ditutup Anda akan menggunakan:

android:configChanges="keyboardHidden"

Jika Anda ingin menangani keduanya, Anda dapat memisahkannya dengan perintah pipe seperti:

android:configChanges="keyboardHidden|orientation"

Ini akan memicu metode onConfigurationChanged dalam Aktivitas apa pun yang Anda panggil. Jika Anda mengesampingkan metode, Anda dapat meneruskan nilai-nilai baru.

Semoga ini membantu.


57
2018-01-19 02:28



Saya baru saja menemukan pengetahuan ini:

Untuk menjaga Kegiatan tetap hidup melalui perubahan orientasi, dan menanganinya onConfigurationChanged, dokumentasi dan contoh kode di atas sarankan ini di file Manifes:

android:configChanges="keyboardHidden|orientation"

yang memiliki manfaat ekstra yang selalu berhasil.

Pengetahuan bonus adalah bahwa menghilangkan keyboardHidden mungkin tampak logis, tetapi menyebabkan kegagalan dalam emulator (setidaknya untuk Android 2.1): hanya menentukan orientation akan membuat emulator memanggil keduanya OnCreate dan onConfigurationChanged terkadang, dan hanya OnCreate lain waktu.

Saya belum melihat kegagalan pada perangkat, tetapi saya telah mendengar tentang kegagalan emulator untuk orang lain. Jadi itu layak didokumentasikan.


39
2017-12-22 21:50



Anda mungkin juga mempertimbangkan menggunakan cara platform Android untuk mempertahankan data di seluruh perubahan orientasi: onRetainNonConfigurationInstance() dan getLastNonConfigurationInstance().

Ini memungkinkan Anda untuk mempertahankan data di seluruh perubahan konfigurasi, seperti informasi yang mungkin Anda peroleh dari pengambilan server atau hal lain yang telah dihitung di onCreate atau karena, sementara juga memungkinkan Android untuk menata ulang Anda Activity menggunakan file xml untuk orientasi yang sekarang digunakan.

Lihat sini atau sini.

Perlu dicatat bahwa metode ini sekarang tidak lagi digunakan (meskipun masih lebih fleksibel daripada menangani perubahan orientasi sendiri karena sebagian besar solusi di atas menyarankan) dengan rekomendasi bahwa setiap orang beralih ke Fragments dan sebagai gantinya gunakan setRetainInstance(true) pada setiap Fragment Anda ingin mempertahankannya.


33
2017-09-22 03:03



Pendekatan ini berguna tetapi tidak lengkap saat menggunakan Fragmen.

Fragmen biasanya dibuat ulang pada perubahan konfigurasi. Jika Anda tidak berharap ini terjadi, gunakan

setRetainInstance(true); dalam konstruktor Fragmen (s)

Ini akan menyebabkan fragmen dipertahankan selama perubahan konfigurasi.

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)


28
2017-09-21 09:09